New Features (2026-06-19) — i18n / l10n Testing

Three pure-standard-library internationalization / localization testing helpers that compound, wired through the full stack (facade, AC_* executor commands, MCP tools, Script Builder).

Pseudo-localization

Accent and pad UI strings (preserving placeholders) to flush out hardcoded text and pre-stress layout before any real translation exists:

from je_auto_control import pseudo_localize, pseudo_localize_catalog

pseudo_localize("Hello {name}")        # "⟦Hèllo {name}········⟧"
pseudo_localize_catalog({"save": "Save", "cancel": "Cancel"})

Placeholders ({name} / {{x}} / %s / %d) are preserved verbatim; expansion controls the padding fraction; the ⟦…⟧ brackets make truncation visible. Exposed as AC_pseudo_localize / ac_pseudo_localize. Untranslated (un-accented) strings in a screen are a sign of unexternalized, hardcoded text.

Text-overflow detection

Flag text whose estimated width exceeds its widget bounds — the #1 localization bug (German/Finnish expand 30–50%). Computed from the accessibility bounds AutoControl already reads:

from je_auto_control import check_overflow

issues = check_overflow(elements, avg_char_px=7.0)
# [{"text": "...", "width": 40, "required_px": 400.0, "overflow_px": 360.0}]

Width is estimated as len(text) * avg_char_px (deterministic heuristic). Exposed as AC_check_overflow / ac_check_overflow (uses the live a11y tree unless elements are supplied).

Catalog completeness

Diff a translation catalog against a base locale for missing / orphaned / empty keys and placeholder mismatches — a CI gate against blank UI:

from je_auto_control import check_catalog

report = check_catalog(base_locale, target_locale)
report["missing"]               # keys absent in target
report["placeholder_mismatch"]  # e.g. "{count}" dropped in the target

Exposed as AC_check_catalog / ac_check_catalog.