Replace the last hard-coded Chinese log/print strings in the Flask
graph API, OASIS profile generator, and retry utility with calls to
the existing t() helper, completing the backend i18n coverage started
by ticket #6 so EN-locale operators see English logs end to end.
Adds nine entries to locales/{en,zh}.json: log.graph_api.m027-m029,
log.profile_generator.m024-m025, and a new log.retry.m001-m004
sub-namespace for the retry utility.
Closes#24
Routes ~50 hard-coded Chinese literals across Process.vue, Step2EnvSetup.vue,
Step3Simulation.vue, Step4Report.vue and Step5Interaction.vue through
vue-i18n, with corresponding entries added in lockstep to locales/en.json and
locales/zh.json (1031 -> 1101 lines each, parity preserved). En-locale users
no longer see Chinese in headers, status messages, error fallbacks, project-
info modals, or chat-history prompt construction.
Backend-coupled regex parsers in Step4Report.vue (28 markers + no-reply
predicate + log-severity helper) are centralised into a frozen REPORT_MARKERS
block at the top of <script setup>, with each entry comment-anchored to its
canonical source line in backend/app/services/zep_tools.py. The block is
allowlisted in the audit script so future English alternates can be added
inline once the backend prompts are translated under spec
i18n-report-agent-prompts (issue #25). The Step2EnvSetup stage watcher gets
the same treatment: a STAGE_PHASE_MAP collapses three Chinese-string
equality checks into a lookup that already accepts both legacy Chinese
display strings and the snake_case backend identifiers.
Adds frontend/scripts/audit-i18n-strings.sh as a local verifier (the
referenced .kiro/specs/i18n-e2e-english-verification audit script no longer
exists). The script greps the five files for non-allowlisted CJK literals,
diffs en.json/zh.json key sets, and guards against an en.json CJK regression
(per #20 / spec i18n-backfill-zh-json). Exits 0 on success.
Closes#23
Extract every Chinese string inside backend logger.{info,warning,error,
debug,exception} calls and inside user-facing jsonify({"error|message":
...}) responses across the listed in-scope modules into
locales/{en,zh}.json under nested namespaces (log.<module>.*,
api.{error,message}.<scope>.*). Locale dictionaries stay structurally
identical; the existing flat frontend-facing keys at log.* / api.* are
left untouched. The locale helper (backend/app/utils/locale.py) now
emits a single deduplicated mirofish.locale warning per (locale, key)
pair when a translation is missing instead of silently returning the
raw key, so unknown keys are visible without crashing requests or
background tasks. A repo-root scripts/check_i18n_logs.py verifier
performs an AST-aware source scan for residual Chinese inside the
in-scope logger/jsonify calls and a recursive parity diff between
en.json and zh.json — both modes pass.
Why: backend logs and API errors previously emitted Chinese-only
strings, leaving English-speaking operators with unreadable log
aggregator output and API consumers with locale-mismatched error
messages. The t() helper and per-thread set_locale propagation already
existed; this change makes every backend caller route through them.
Closes#6
- Add sans-serif font for English left-pane (status, workflow sections)
- Shorten English workflow step descriptions
- Reduce English report title font-size from 36px to 28px
- Use sans-serif font for English titles, descriptions and navbar
- Shorten English hero text to avoid overflow
- Fix :global() scoped CSS issue that was setting root font-size to 3.5rem
- Use separate unscoped style block for html[lang] selectors