Skip to content

Commit 8793664

Browse files
wehosHongzhi Wenclaude
authored
refactor(galgame): UI cleanup + capture chain (dxcam→mss→pyautogui) + dead-code cleanup (#1191)
* feat(galgame): add PyAutoGuiCaptureBackend, drop PrintWindow from default chain Refactor screenshot backend chain to dxcam → mss → pyautogui as the new fallback strategy. PrintWindow is intentionally removed from the default chain because: - It's a "render to DC" mechanism that often produces stale frames on DirectX/Unity games (already documented as `selected_legacy_fallback` in the previous detail label). - Slower than BitBlt-based backends (mss/pyautogui). - Inner implementation already falls back to BitBlt when PrintWindow itself fails, so its theoretical "capture occluded windows" advantage doesn't always materialize. PrintWindow is still kept reachable in two narrower roles: 1. Explicit `selection="printwindow"`: chain becomes `[printwindow, dxcam, mss, pyautogui]` so power users who actually need occluded-window capture still have it as the first attempt with sane fallbacks if PrintWindow returns black/empty. 2. Smart-mode background target: still uses `[printwindow]` only since it's the only backend that can plausibly capture an occluded window (others read screen pixels). ocr_reader already emits `backend_not_suitable_for_background` warning when quality is poor, so the failure mode stays observable. PyAutoGuiCaptureBackend is a thin wrapper over `pyautogui.screenshot()` (already a main dep for brain/computer_use). On Windows it goes through the same GDI path as mss; on macOS/Linux it shells out to platform screenshot tools — slower than mss but battle-tested as a defense-in-depth fallback. New chain matrix: | selection | chain | |-------------|-------------------------------------------------| | auto / dxcam| dxcam → mss → pyautogui | | mss | mss → dxcam → pyautogui | | pyautogui | pyautogui → dxcam → mss | | printwindow | printwindow → dxcam → mss → pyautogui | | smart fg | dxcam → mss → pyautogui | | smart bg | [printwindow] only (occluded-window capture) | Existing chain ordering tests updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(galgame-ui): remove rapidocr/dxcam install buttons, replace with bundled hint PR #1188 removed the runtime install machinery for rapidocr/dxcam from the Python side (HTTP routes, SDK actions, support helpers). The UI side was left half-done: install buttons + JS handlers + i18n strings were still in place. This commit completes the cleanup: - static/main.js: - Drop RAPIDOCR_INSTALL_URL / DXCAM_INSTALL_URL constants - OCR_INSTALL_TABS = ['tesseract'] (was: rapidocr/dxcam/tesseract) - Drop rapidocr/dxcam entries from getInstallUIConfig() registry - Drop dependencySummaryItem rapidocr/dxcam branches (unreachable) - Drop installRapidOcr / installDxcam / restoreRapidOcr*Install*State - Drop case 'install_rapidocr' from action handler - Drop init promise.all entries for rapidocr/dxcam restore - Drop click event listeners for rapidocrInstallBtn / dxcamInstallBtn - activeInstallTab default 'rapidocr' → 'tesseract' - Add pyautoguiUseBtn click handler (new backend selection) - static/main.js (renderRapidOcr / renderDxcam): Rewrite both functions to drop install-button DOM lookups and all install task state branches. Status banners (rapidocrPrompt, dxcamPrompt) now show: - Installed: ready/active state with detected_path + model_cache_dir - Not installed: bundled hint pointing dev to `uv sync --group galgame` or telling end-users to reinstall the packaged build - broken_runtime: "rebuild venv" hint for upgrade users with stale legacy installs Also added pyautoguiUseBtn config in renderDxcam alongside other capture-backend select buttons. - static/index.html: drop <button id="rapidocrInstallBtn"> and <button id="dxcamInstallBtn">; add <button id="pyautoguiUseBtn">. - i18n × 5 locales (zh-CN/en/ja/ko/ru): symmetric -25/+7 — drop install-action keys (action/retry/queued/success/failure/installing_*/ install_kicker/failed_title/completed_refresh_title/install_first_title/ missing_models_*) for both kinds; add bundled_hint, unavailable_title, pyautogui.use/.using/.title. - integration test test_galgame_bridge_ui_routes.py: Drop assertions for now-removed JS strings (RAPIDOCR_INSTALL_URL, DXCAM_INSTALL_URL, restoreRapidOcrInstallState, restoreDxcamInstallState) and i18n key (ui.install.rapidocr.action). Re-target i18n bundle smoke check at ui.install.tesseract.action which still exists. Plugin loads cleanly with `--group galgame` synced and without (rapidocr status reports detail=missing in the latter case, which renders as the bundled_hint banner instead of an install button). Chain ordering tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(galgame): drop force_reload param + _purge_modules dead helper Proposal A from PR #1188 cleanup discussion. The runtime install path that used `force_reload=True` to evict cached `rapidocr_onnxruntime` sys.modules entries is gone (HTTP routes deleted, install_rapidocr function deleted). The remaining `inspect_rapidocr_installation` callsite always passes `force_reload=False`, so the parameter and the helper it gates are dead code. - `load_rapidocr_runtime` drops `force_reload: bool = False` param - `_purge_modules` function deleted - Sole remaining callsite (inspect_rapidocr_installation) updated Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(galgame): drop dead rapidocr_install_{manifest_url,timeout_seconds} cfg fields Both fields fed only the runtime install machinery that PR #1188 deleted (HTTP fetch of install manifest JSON / subprocess timeout for pip install). After install code removal, no consumer reads them. Removed: - `GalgameRapidOcrConfig.rapidocr_install_manifest_url` - `GalgameRapidOcrConfig.rapidocr_install_timeout_seconds` - Corresponding `_FIELD_MAP` entries in `GalgameConfig` - Constructor kwargs in `service.py:_build_rapidocr_config` - Test fixture entries in `test_ocr_pipeline.py` Backward compat: old user cfg files with these keys → service.py loader no longer calls `.get()` on them, so the dict entries are silently ignored. No migration shim needed. Kept (despite the misleading "install" prefix): - `rapidocr_install_target_dir`: still actively used by ocr_reader as the runtime model cache root (rapidocr writes downloaded model files here). Renaming to `rapidocr_model_cache_root` belongs in a follow-up — too invasive (touches schema + UI + i18n). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame): address codex P1+P2 on PR #1191 P1: load_rapidocr_runtime caller in ocr_reader.py was missed by the force_reload removal commit. RapidOcrReader._ensure_runtime still passed `force_reload=False`, which would raise TypeError on first OCR runtime init (cache miss / warmup path). Drop the kwarg from the caller to match the new signature. P2: OCR_INSTALL_TABS shrinking to ['tesseract'] left two issues: - HTML still rendered tab buttons for rapidocr/dxcam → clicking them coerced to tesseract via switchInstallTab fallback (UI inconsistency) - revealCaptureBackendSettings() called switchInstallTab('dxcam') → same coercion to tesseract instead of focusing dxcam panel Drop the rapidocr / dxcam install-tab buttons from index.html (their banners are always visible now, no tab gating). Drop the dead switchInstallTab('dxcam') call from revealCaptureBackendSettings — expandAndScrollTo('dxcamPrompt') alone scrolls correctly without needing to activate a (now nonexistent) tab. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame-ui): re-route install_rapidocr action to bundled hint banner Codex P2 on PR #1191: removing `case 'install_rapidocr'` from the action handler switch left dangling action emitters. `withRapidOcrInstallAction()` (general diagnosis flow) and the onboarding action button still produce `install_rapidocr` action IDs. Source-install users without `--group galgame` would see the action button, click it, and hit the default "action unavailable" warning — broken UX. Keep the action ID for backward compat with all emitter sites, but change semantics + label: - Re-add `case 'install_rapidocr'` to the action handler — now scrolls to `rapidocrPrompt` (where bundled_hint copy already explains reinstall packaged build / `uv sync --group galgame`). - Action label: "一键安装 RapidOCR" → "查看 RapidOCR 启用提示" (and 5 locales) - New flash key `ui.flash.rapidocr_hint_revealed` (5 locales) shown when the action triggers, telling user to follow the on-banner steps. User who clicks now lands on the actionable hint instead of dead-end warning. Action ID name "install_rapidocr" is misleading post-change but fully internal; renaming would touch 5 client-side sites + i18n key for cosmetic improvement only — not worth the diff. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame-ui): renderPluginUnavailable safe for missing rapidocr/dxcam install config Codex P1 on PR #1191: renderPluginUnavailable() iterates ['rapidocr', 'dxcam', 'tesseract', 'textractor'] and calls getInstallConfig(kind) for each. Since rapidocr/dxcam were removed from getInstallUIConfig() in commit e942d8e, this throws on the first iteration — exactly the wrong moment, since this fallback render runs precisely when the plugin is unavailable and diagnostics are needed most. Restructure the loop: - Use a static PROMPT_LABELS table (rapidocr/dxcam labels are just brand strings, no need to round-trip through the install registry). - Address banner DOM elements by `${kind}Prompt` directly (the prefix matches the kind for all 4). - Guard `card`/`button` updates behind `kind in {'tesseract', 'textractor'}` — bundled rapidocr/dxcam no longer have install button/card DOM (removed in HTML cleanup). - Defensive `if (banner)` early-continue: future-proof against any banner being removed without breaking the whole render. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame-ui): address coderabbit review on PR #1191 (3 actionable) 3 valid concerns from coderabbit review of commits 99e1c1f + e942d8e: 1. **PyAutoGUI multi-monitor bug** (Major) — PyAutoGuiCaptureBackend used `pyautogui.screenshot(region=...)` which internally calls Pillow `ImageGrab.grab()` without `all_screens=True`. PyAutoGUI 0.9.54 doesn't expose that flag, so secondary-monitor or negative-coordinate windows silently truncate to primary screen → OCR sees garbage. Switch to direct `ImageGrab.grab(bbox=..., all_screens=True)`. `is_available()` still gates on `import pyautogui` to keep the user-facing label honest. Comment explains why we bypass pyautogui's wrapper. all_screens=True is Windows-only in Pillow but harmlessly ignored on macOS/Linux. 2. **i18n PyAutoGUI casing** (Minor) — `ui.install.pyautogui.title` used lowercase `pyautogui` while `.use` and `.using` use brand `PyAutoGUI`. Was wrong in all 5 locales (en/ja/ko/ru/zh-CN, plus the main.js fallback string), not just the zh-CN line coderabbit flagged. 3. **Capture chain copy stale** (Minor) — `ui.install.capture_auto.title` and `ui.flash.capture_backend_settings_revealed` still listed "DXcam, MSS, PrintWindow" — missing PyAutoGUI which is now the third default-chain backend (PrintWindow moved to explicit-only + Smart background). Same issue across all 5 locales (coderabbit only flagged ru, but the rest had identical wording). Fold PyAutoGUI into the chain copy, note PrintWindow's narrower role. i18n × 5 locale × 3 keys = 15 symmetric updates. ocr_reader.py change is the substantive fix. Chain ordering tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame): address codex/coderabbit review on PR #1191 (3 actionable) 3 valid follow-ups from review of commit 87e7a65: 1. **Plugin-unavailable fallback leaves bundled banners hidden** (codex P2, main.js:2973): refreshAll() failure path rewrites RapidOCR/DXcam banner text but doesn't clear HTML `hidden`. Post-refactor switchInstallTab() only iterates ['tesseract'], so rapidocrPrompt / dxcamPrompt never get unhidden in the exact failure mode where the user needs the bundled-setup hint. Add explicit `banner.hidden = false` in the loop body. 2. **PyAutoGUI is_available crashes on non-ImportError** (codex P2 + coderabbit, ocr_reader.py:2505): pyautogui's import touches platform display state; in headless / WSL / missing-DISPLAY environments it may raise KeyError or RuntimeError instead of ImportError. With `except ImportError`, the exception bubbles up and aborts capture preflight. Widen to `except Exception` so backend probing degrades cleanly to "unavailable". 3. **Korean common values not localized** (coderabbit, ko.json:1010): `ui.common.none_value` was English `(none)`. While at it, also fix `ui.common.auto_value` which had the same issue. Now (없음) / (자동) — consistent with ja `(なし)/(自動)` and ru `(нет)/(авто)`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame): address coderabbit review on PR #1191 (2 actionable, 1 follow-up test) 1. **Major: Explicit PrintWindow chain semantics broken** (ocr_reader.py) `selection="printwindow"` chain was [printwindow, dxcam, mss, pyautogui] for ALL targets. PrintWindow's only reason to exist post-bundling is capturing occluded / background windows. If PrintWindow failed on a background target, silent fallback to dxcam/mss/pyautogui reads screen pixels — usually the occluding window, not the game — and OCR produces confident garbage from the wrong source. Fix: split _ordered_backends_for_target by target type, mirroring Smart mode's pattern: - Foreground target: keep [printwindow, dxcam, mss, pyautogui] (other backends also see the right window, fallback safe) - Background target: [printwindow] only (no silent screen-grab fallback) - Minimized: raise printwindow:target_window_minimized_for_capture New test test_win32_capture_backend_printwindow_strict_for_background_target locks in the foreground/background asymmetry. 2. **Minor: revealCaptureBackendSettings + install_rapidocr action don't expand collapsed parents** (main.js) `expandAndScrollTo('dxcamPrompt')` / `expandAndScrollTo('rapidocrPrompt')` only scroll. Both banners live inside `advancedSettings` + dependency `<details>` which default to collapsed. After scroll the user lands on a still-collapsed parent — the action effectively no-ops. Fix: prefix with navigateToInstallPanel(kind) which expands both containers (rapidocr/dxcam aren't in OCR_INSTALL_TABS so the tab-switch side of navigateToInstallPanel is a noop, but the expansion runs). Also synced JS fallback string for `capture_backend_settings_revealed` to match the i18n key (already includes PyAutoGUI from prior commit; the JS fallback was stale). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(galgame-ui): make navigateToInstallPanel scroll opt-out so banner scroll wins Coderabbit minor on PR #1191: previous fix chained `navigateToInstallPanel(kind)` + `expandAndScrollTo(banner)` to expand collapsed parents before scrolling to the specific banner. But navigateToInstallPanel queues `installSection.scrollIntoView()` in the next animation frame — that fires AFTER expandAndScrollTo's synchronous scroll, snapping the viewport back to installSection top and hiding the banner the caller just landed on. Add `scrollToSection: true` option to navigateToInstallPanel; the two banner-targeted callers pass `false` to opt out of the queued scroll while keeping the Advanced Settings + dependency `<details>` expansion side effects. - revealCaptureBackendSettings: navigateToInstallPanel('dxcam', { scrollToSection: false }) + expandAndScrollTo('dxcamPrompt') - case 'install_rapidocr': navigateToInstallPanel('rapidocr', { scrollToSection: false }) + expandAndScrollTo('rapidocrPrompt') Existing onboarding callers of navigateToInstallPanel keep the default (scrollToSection=true) — they want the section-top scroll. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Hongzhi Wen <cartabio.coder1@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 8a56ef5 commit 8793664

16 files changed

Lines changed: 374 additions & 389 deletions

File tree

plugin/plugins/galgame_plugin/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def _log_plugin_noncritical(logger: Any, level: str, message: str, *args: Any) -
145145

146146

147147
_OCR_BACKEND_SELECTIONS = {"auto", "rapidocr", "tesseract"}
148-
_OCR_CAPTURE_BACKEND_SELECTIONS = {"auto", "smart", "dxcam", "mss", "printwindow"}
148+
_OCR_CAPTURE_BACKEND_SELECTIONS = {"auto", "smart", "dxcam", "mss", "pyautogui", "printwindow"}
149149

150150

151151
def _migrate_legacy_capture_backend(value: object) -> object:
@@ -4055,7 +4055,7 @@ async def _poll_bridge_locked(self, *, force: bool) -> None:
40554055
and str(getattr(self._cfg, "ocr_reader_capture_backend", "") or "")
40564056
.strip()
40574057
.lower()
4058-
in {"smart", "dxcam", "mss", "printwindow"}
4058+
in {"smart", "dxcam", "mss", "pyautogui", "printwindow"}
40594059
)
40604060
)
40614061
memory_reader_default_is_unavailable = (

plugin/plugins/galgame_plugin/i18n/ui/en.json

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,6 @@
9696
"ui.install.memory_deps": "Memory Reader Dependencies",
9797
"ui.install.memory_desc": "Textractor is only used for the memory reader fallback path and does not affect OCR capture recognition.",
9898
"ui.install.running": "Installing in background...",
99-
"ui.install.rapidocr.action": "Install RapidOCR",
100-
"ui.install.rapidocr.retry": "Retry RapidOCR Installation",
101-
"ui.install.rapidocr.queued": "Background installation task created. It will install the plugin-isolated RapidOCR runtime and stream progress via SSE.",
102-
"ui.install.rapidocr.success": "RapidOCR installed",
103-
"ui.install.rapidocr.failure": "RapidOCR installation failed",
104-
"ui.install.dxcam.action": "Install DXcam",
105-
"ui.install.dxcam.retry": "Retry DXcam Installation",
106-
"ui.install.dxcam.queued": "Background installation task created. It will install the DXcam capture dependency and stream progress via SSE.",
107-
"ui.install.dxcam.success": "DXcam installed",
108-
"ui.install.dxcam.failure": "DXcam installation failed",
10999
"ui.install.tesseract.action": "Install Tesseract",
110100
"ui.install.tesseract.retry": "Retry Tesseract Installation",
111101
"ui.install.tesseract.queued": "Background installation task created. It will download Tesseract and language packs over HTTPS and stream progress via SSE.",
@@ -456,7 +446,6 @@
456446
"ui.field.memory_counts": "Memory Counts",
457447
"ui.install.rapidocr.using": "Using RapidOCR",
458448
"ui.install.rapidocr.force_title": "Force OCR Reader to use RapidOCR",
459-
"ui.install.rapidocr.install_first_title": "Install RapidOCR first",
460449
"ui.install.ocr_auto.using": "OCR auto selection",
461450
"ui.install.ocr_auto.title": "Auto-select the OCR backend with RapidOCR first and Tesseract as fallback",
462451
"ui.status.unknown": "Unknown",
@@ -472,9 +461,6 @@
472461
"ui.install.rapidocr.ready_body": "RapidOCR has finished installing. When no SDK or valid memory text is available, it will take priority over Tesseract as the OCR Reader backend.",
473462
"ui.install.detected_path": "Detected path",
474463
"ui.install.model_dir": "Model directory",
475-
"ui.install.rapidocr.kicker_missing_models": "Primary OCR backend missing models",
476-
"ui.install.rapidocr.missing_models_title": "RapidOCR runtime exists, but the model state is incomplete",
477-
"ui.install.rapidocr.missing_models_body": "The RapidOCR package exists, but the completed-install flag or model cache marker is missing. Reinstalling will warm-check and repair the state.",
478464
"ui.install.target_dir": "Target directory",
479465
"ui.install.rapidocr.kicker_broken": "Primary OCR backend error",
480466
"ui.install.rapidocr.broken_title": "RapidOCR runtime is broken or failed to import",
@@ -483,12 +469,7 @@
483469
"ui.install.rapidocr.not_ready_title": "RapidOCR is not ready yet",
484470
"ui.install.rapidocr.not_ready_body": "RapidOCR is now the internal primary backend for OCR Reader. After install, it will take priority over Tesseract, which remains only as a compatibility fallback.",
485471
"ui.install.expected_path": "Expected install path",
486-
"ui.install.rapidocr.install_kicker": "RapidOCR installation",
487-
"ui.install.rapidocr.installing_title": "RapidOCR is installing in the background",
488-
"ui.install.rapidocr.installing_body": "The page receives live progress through SSE. When installation finishes, the plugin status will refresh and switch back to RapidOCR first.",
489-
"ui.install.rapidocr.failed_title": "RapidOCR installation failed and can be retried",
490472
"ui.install.task_failed_retry": "The background install task failed. You can click the button again to retry.",
491-
"ui.install.rapidocr.completed_refresh_title": "RapidOCR installation completed, refreshing OCR status",
492473
"ui.install.task_done_refreshing": "The install task has ended and the plugin status is waiting to refresh.",
493474
"ui.action.refresh_all": "Refresh All",
494475
"ui.action.debug_details": "View Debug Details",
@@ -499,7 +480,7 @@
499480
"ui.action.recalibrate_ocr": "Recalibrate OCR",
500481
"ui.action.line_details": "View Recognition Details",
501482
"ui.action.choice_advisor": "Switch to Auto Advance",
502-
"ui.action.install_rapidocr": "Install RapidOCR",
483+
"ui.action.install_rapidocr": "View RapidOCR setup hint",
503484
"ui.action.refresh_status": "Refresh Status",
504485
"ui.pending.locking": "Locking...",
505486
"ui.pending.clearing": "Clearing...",
@@ -533,7 +514,7 @@
533514
"ui.flash.sending_agent": "Sending to Agent...",
534515
"ui.agent.no_reply": "Agent returned no text",
535516
"ui.flash.agent_responded": "Agent responded",
536-
"ui.install.capture_auto.title": "Auto-select the capture backend with DXcam first and MSS/PrintWindow as fallbacks",
517+
"ui.install.capture_auto.title": "Default chain: DXcam first, MSS → PyAutoGUI as fallbacks (PrintWindow only as explicit selection or Smart background)",
537518
"ui.install.capture_auto.using": "Capture auto selection",
538519
"ui.install.compat_fallback": "compatibility fallback",
539520
"ui.install.current_plugin_python": "current plugin Python environment",
@@ -548,7 +529,6 @@
548529
"ui.install.printwindow.title": "Use Win32 PrintWindow fallback; DirectX/Unity games may return stale frames",
549530
"ui.install.dxcam.using": "Using DXcam",
550531
"ui.install.dxcam.force_title": "Force the capture backend to use DXcam",
551-
"ui.install.dxcam.install_first_title": "Install DXcam first",
552532
"ui.install.dxcam.selected_waiting": "DXcam selected, waiting for the next OCR capture to confirm",
553533
"ui.install.dxcam.unsupported_title": "Automatic DXcam installation is not supported on this platform",
554534
"ui.install.dxcam.unsupported_body": "The DXcam capture backend is only for Windows desktop capture; this platform will continue using compatible capture options.",
@@ -561,11 +541,6 @@
561541
"ui.install.dxcam.kicker_not_ready": "Capture dependency not ready",
562542
"ui.install.dxcam.not_ready_title": "DXcam not detected",
563543
"ui.install.dxcam.not_ready_body": "After installing DXcam, the auto capture backend will prefer GPU Desktop Duplication for foreground game capture, reducing plugin-page occlusion and stale PrintWindow frames.",
564-
"ui.install.dxcam.install_kicker": "DXcam installation",
565-
"ui.install.dxcam.installing_title": "DXcam is installing in the background",
566-
"ui.install.dxcam.installing_body": "The page receives live installation progress through SSE. After installation, the OCR capture backend status will refresh.",
567-
"ui.install.dxcam.failed_title": "DXcam installation failed and can be retried",
568-
"ui.install.dxcam.completed_refresh_title": "DXcam installation completed, refreshing capture status",
569544
"ui.install.tesseract.using": "Using Tesseract",
570545
"ui.install.tesseract.force_title": "Force OCR Reader to use Tesseract",
571546
"ui.install.tesseract.install_first_title": "Install Tesseract and required language packs first",
@@ -704,7 +679,7 @@
704679
"ui.flash.status_refresh_failed": "Status refresh failed. Try again later.",
705680
"ui.flash.debug_details_expanded": "OCR runtime debug details expanded.",
706681
"ui.flash.line_details_revealed": "Moved to current line recognition details.",
707-
"ui.flash.capture_backend_settings_revealed": "Moved to capture backend settings. You can switch DXcam, MSS, or PrintWindow.",
682+
"ui.flash.capture_backend_settings_revealed": "Moved to capture backend settings. You can switch DXcam, MSS, PyAutoGUI, or PrintWindow.",
708683
"ui.flash.focus_game_window": "Return to the game window. After it is foreground again, recognition will continue on the next refresh.",
709684
"ui.flash.action_unavailable": "This action is not available yet.",
710685
"ui.flash.refreshing_plugin_status": "Refreshing plugin status...",
@@ -1032,5 +1007,13 @@
10321007
"ui.error.plugin_call_timeout": "Plugin call timed out",
10331008
"ui.settings.saving_hint": "Saving...",
10341009
"ui.common.auto_value": "(auto)",
1035-
"ui.common.none_value": "(none)"
1010+
"ui.common.none_value": "(none)",
1011+
"ui.install.rapidocr.bundled_hint": "RapidOCR is now bundled with the main program. If you're running the packaged build, please reinstall it; if you're running from source, run `uv sync --group galgame` and restart.",
1012+
"ui.install.rapidocr.unavailable_title": "RapidOCR unavailable — use the packaged build, or run `uv sync --group galgame` from source",
1013+
"ui.install.dxcam.bundled_hint": "DXcam is now bundled with the main program (Windows only). If you're running the packaged build, please reinstall it; if from source, run `uv sync --group galgame` and restart. The capture chain falls back to MSS / PyAutoGUI automatically.",
1014+
"ui.install.dxcam.unavailable_title": "DXcam unavailable — Windows only, requires packaged build or `uv sync --group galgame`",
1015+
"ui.install.pyautogui.use": "Use PyAutoGUI",
1016+
"ui.install.pyautogui.using": "Using PyAutoGUI",
1017+
"ui.install.pyautogui.title": "Use the cross-platform PyAutoGUI screenshot backend (slower on macOS/Linux)",
1018+
"ui.flash.rapidocr_hint_revealed": "Scrolled to the RapidOCR status banner. Follow the on-banner steps (reinstall packaged build / uv sync --group galgame)."
10361019
}

0 commit comments

Comments
 (0)