Claude Desktop Chinese Patch (macOS & Windows & Linux)
This report summarizes scanner evidence for javaht/claude-desktop-zh-cn, a Python project with 7,541 GitHub stars. SynthScan examined 59,479 lines of code across 36 source files, recording 206 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 4.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 73 finding(s).
Are imports declared and package/API names verified? 12 finding(s).
Are wrappers, guards, and repeated structures necessary? 176 finding(s).
Which changes need focused human review? 206 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 206 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/experimental/frida_launch_zh.py | 544 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 555 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1372 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1425 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1434 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1443 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 599 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 721 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 726 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1360 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1410 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 796 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1209 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1250 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1882 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 151 | except OSError: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1900 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1653 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1661 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1682 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh.py | 1693 | except Exception: | CODE |
| HIGH | scripts/experimental/typing_shim_sitecustomize.py | 32 | except Exception: | CODE |
| HIGH | scripts/experimental/typing_shim_sitecustomize.py | 30 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 256 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 1070 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 912 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 917 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 925 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 820 | except Exception: | CODE |
| HIGH | scripts/experimental/frida_launch_zh_win.py | 852 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install-linux.sh | 59 | except Exception: | CODE |
| LOW⚡ | scripts/patch_claude_zh_cn.py | 2536 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 154 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 365 | except Exception as exc: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2115 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2256 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2429 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2619 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2936 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2968 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 3029 | except Exception: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 3211 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 791 | except Exception as exc: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 793 | except Exception as exc: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 796 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1200 | except Exception as exc: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1206 | except Exception as exc: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1209 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1425 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1434 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1443 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1643 | except Exception as exc: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1653 | except Exception: | CODE |
| LOW⚡ | scripts/experimental/frida_launch_zh.py | 1661 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 157 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 500 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 544 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 555 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 599 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 626 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 649 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 665 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 721 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 726 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 750 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 814 | except Exception as exc: # pragma: no cover | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 845 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 872 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 907 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 939 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 969 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 991 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1025 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1079 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1247 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1250 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1271 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1308 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1360 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1372 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1387 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1410 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1622 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1682 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1693 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1858 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1882 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1900 | except Exception: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1931 | except Exception as exc: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1987 | except Exception as exc: | CODE |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/patch_claude_zh_cn.py | 240 | def is_plain_ui_text_replacement(source: str) -> bool: | CODE |
| LOW⚡ | scripts/patch_claude_zh_cn.py | 245 | def is_structural_js_literal_context(text: str, literal_start: int) -> bool: | CODE |
| LOW⚡ | scripts/patch_claude_zh_cn.py | 250 | def replace_frontend_hardcoded_text( | CODE |
| LOW⚡ | scripts/patch_claude_zh_cn.py | 2528 | def load_json_object_or_backup(path: Path, dry_run: bool = False) -> dict[str, Any]: | CODE |
| LOW⚡ | scripts/patch_claude_zh_cn.py | 2545 | def ensure_config_library_entry(meta: dict[str, Any], config_id: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 159 | def require_virtualization_entitlement(app: Path) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 203 | def patch_language_display_names(app: Path) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 220 | def load_frontend_hardcoded_replacements(lang_code: str) -> list[tuple[str, str]]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 321 | def patch_hardcoded_frontend_strings(app: Path, lang_code: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 437 | def encode_asar_header_dynamic(header_string: str) -> bytes: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 537 | def replace_asar_file_content(app: Path, file_path: str, patched_content: bytes) -> bool: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 574 | def is_online_dom_translation_entry(source: str, target: str) -> bool: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 583 | def build_online_translation_map(app: Path, lang_code: str) -> dict[str, str]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 607 | def build_online_dom_translation_script(lang_code: str, mapping: dict[str, str]) -> str: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 862 | def build_online_locale_main_process_script( | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 890 | def strip_online_locale_main_process_patch(text: str) -> tuple[str, bool]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 912 | def strip_online_locale_lock_patch(text: str) -> tuple[str, bool]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 967 | def find_online_locale_lock_asar_target( | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1007 | def patch_online_locale_lock_in_asar(app: Path, lang_code: str) -> str: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1026 | def find_main_view_dom_ready_handler(text: str) -> re.Match[str] | None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1054 | def find_main_process_asar_target( | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1091 | def patch_online_locale_main_process(app: Path, lang_code: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1216 | def update_electron_asar_integrity(app: Path, header_string: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1314 | def get_model_picker_replacements(lang_code: str) -> dict[str, str]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1356 | def patch_model_picker_strings(app: Path, lang_code: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1387 | def get_main_process_menu_replacements(lang_code: str) -> dict[str, str]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1591 | def get_main_process_menu_intl_replacements(lang_code: str) -> dict[str, str]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1738 | def get_main_process_menu_role_replacements(lang_code: str) -> dict[str, str]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1839 | def replace_menu_intl_message_by_id(text: str, message_id: str, target: str) -> tuple[str, int]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1876 | def replace_menu_literal_length_preserving(text: str, source: str, target: str) -> tuple[str, int]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1896 | def patch_length_preserving_main_process_menu_labels(app: Path, lang_code: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1941 | def patch_hardcoded_main_process_menu_labels(app: Path, lang_code: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2265 | def _codesign_team_and_signature(path: Path) -> tuple[str, str]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2291 | def verify_frida_resign_consistent(app: Path) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2445 | def install_locale_resources_in_place( | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2557 | def get_existing_third_party_config(user_home: Path, dry_run: bool = False) -> tuple[Path, Path, dict[str, Any]] | None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2576 | def set_third_party_config_auto_updates(user_home: Path, enabled: bool, dry_run: bool = False) -> bool: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2600 | def managed_preferences_user_name(user_home: Path) -> str: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2607 | def set_macos_managed_auto_updates(user_home: Path, enabled: bool, dry_run: bool = False) -> bool: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2703 | def discover_cc_switch_skills(skills_dir: Path) -> list[dict[str, Any]]: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2728 | def find_claude_desktop_skills_plugin_root(user_home: Path) -> Path: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2972 | def preinstall_should_restore(app: Path) -> bool: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 3043 | def verify_electron_asar_integrity(app: Path) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 3065 | def verify_online_locale_patch(app: Path, lang_code: str) -> None: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 264 | def build_runtime_replacements(app: Path) -> list[dict[str, str]]: | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 566 | def make_frida_message_handler( | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 888 | def ensure_user_locale_if_wrong( | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1293 | def install_native_menu_hooks( | CODE |
| LOW | scripts/experimental/frida_launch_zh.py | 1786 | def refresh_payload_if_needed(*, force: bool = False, reason: str = "change") -> bool: | CODE |
| LOW | scripts/experimental/frida_launch_zh_win.py | 126 | def replace_asar_file_content_in_file(asar_path: Path, file_path: str, patched_content: bytes) -> bool: | CODE |
| LOW | scripts/experimental/frida_launch_zh_win.py | 157 | def patch_main_process_menu_in_asar_file(asar_path: Path, lang: str) -> tuple[int, int, int, int]: | CODE |
| LOW | scripts/experimental/frida_launch_zh_win.py | 234 | def prepare_patched_asar_cache(source_asar: Path, lang: str, source_fp: dict[str, Any]) -> Path: | CODE |
| LOW | scripts/experimental/frida_launch_zh_win.py | 284 | def build_runtime_replacements(asar_path: Path, exe_path: Path) -> list[dict[str, str]]: | CODE |
| LOW | scripts/experimental/frida_launch_zh_win.py | 767 | def make_frida_message_handler() -> Any: | CODE |
| LOW | scripts/experimental/objc.js | 1 | var bridge=function(){let cachedApi=null;const defaultInvocationOptions={exceptions:"propagate"};function getApi(){if(nu | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/convert_traditional.py | 106 | CODE | |
| LOW | scripts/convert_traditional.py | 119 | CODE | |
| LOW | scripts/convert_traditional.py | 305 | CODE | |
| LOW | scripts/convert_traditional.py | 129 | CODE | |
| LOW | scripts/patch_claude_zh_cn.py | 1173 | CODE | |
| LOW | scripts/patch_claude_zh_cn.py | 1236 | CODE | |
| LOW | scripts/patch_claude_zh_cn.py | 2265 | CODE | |
| LOW | scripts/patch_claude_zh_cn.py | 2291 | CODE | |
| LOW | scripts/patch_claude_zh_cn.py | 2405 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 98 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 1570 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 1705 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 2015 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 1673 | CODE | |
| LOW | scripts/experimental/frida_launch_zh_win.py | 980 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/convert_traditional.py | 21 | CODE | |
| LOW | scripts/patch_linux_asar.py | 14 | CODE | |
| LOW | scripts/patch_claude_zh_cn.py | 17 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 29 | CODE | |
| LOW | scripts/experimental/frida_launch_zh.py | 62 | CODE | |
| LOW | scripts/experimental/frida_launch_zh_win.py | 14 | CODE | |
| LOW | scripts/experimental/frida_launch_zh_win.py | 51 | CODE | |
| LOW | scripts/experimental/cdp_launch_zh.py | 12 | CODE | |
| LOW | scripts/experimental/cdp_launch_zh.py | 18 | CODE | |
| LOW | …s/claude-desktop-zh-localize/scripts/verify_mapping.py | 15 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install-linux.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/experimental/requirements-frida.txt | 1 | # Frida runtime Chinese launcher dependencies (macOS + Windows experimental). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/patch_claude_zh_cn.py | 518 | def set_asar_offset(entry: dict[str, Any], offset: int) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 1216 | def update_electron_asar_integrity(app: Path, header_string: str) -> None: | CODE |
| LOW | scripts/patch_claude_zh_cn.py | 2405 | def set_user_locale(user_home: Path, lang_code: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/patch_claude_zh_cn.py | 809 | '["aria-label","title","placeholder","value"].forEach(a=>{' | CODE |
| LOW | scripts/experimental/frida_launch_zh_win.py | 622 | for(const a of ["aria-label","title","placeholder","value"]){ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/experimental/frida-zh-resident-ctl.sh | 3 | # Usage: | COMMENT |