Skip to content

fix(i18n): repay pre-existing KO/ES translation debt (FIX-I18N-DEBT-REPAYMENT) - #116

Merged
FullGas1 merged 2 commits into
developfrom
fix/i18n-debt-repayment
Aug 10, 2026
Merged

fix(i18n): repay pre-existing KO/ES translation debt (FIX-I18N-DEBT-REPAYMENT)#116
FullGas1 merged 2 commits into
developfrom
fix/i18n-debt-repayment

Conversation

@FullGas1

@FullGas1 FullGas1 commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Follow-up to FIX-I18N-DICT-GUARD (PR fix(i18n): CI-enforced dictionary guard (FIX-I18N-DICT-GUARD) #115), which explicitly deferred this work: "A follow-up lot to repay the existing debt must follow immediately" (ADR 0013).
  • 93 empty entries in CTLD_i18n_ko.lua and 78 in CTLD_i18n_es.lua at merge (cfb7cd6). Of those, 23 (KO) / 8 (ES) turned out to be -- STALE: in CTLD_i18n_en.lua - keys no longer referenced by any ctld.tr()/config-YAML call in src/. The shared parser (tools/build/i18n_dict_utils.py) doesn't distinguish a live entry from a commented-out one, so they still counted as raw stubs; translating dead keys would fix no live menu entry, so they were excluded.
  • The 70 live entries per language (identical key set for both) are now translated.
  • No ANTHROPIC_API_KEY was available (separate Anthropic Console billing, distinct from the Claude Code subscription used to run this lot), so translations were produced and written directly into the dictionary files rather than via translate_i18n.py - the script itself is untouched and remains the documented mechanism for next time.
  • JTAC and %1 [%2] %3. (no translatable content) added to each dictionary's __keep_en block rather than left flagged as stubs forever - the existing mechanism already used for CTLD, MLRS, etc.
  • No tooling changed: translate_i18n.py, i18n_dict_utils.py, check_i18n_diff.py, i18n-guard CI job all untouched. Translation content only.
  • Lot: .backlog/FIX-I18N-DEBT-REPAYMENT/ - PRD plus 1 ticket.

Test plan

  • pytest tools/build/ - 17/17 green, unchanged (no logic touched)
  • generate_i18n_dicts.ps1 dry-run - 0 MISSING reported
  • luac -p on both modified files - syntax OK
  • Manually verified 0 live empty entries remain in CTLD_i18n_ko.lua / CTLD_i18n_es.lua outside __keep_en
  • CI green on this PR

Generated with Claude Code

Summary by Sourcery

Repay the previously deferred Korean and Spanish i18n translation debt for CTLD F10 menus without changing tooling or game logic.

Bug Fixes:

  • Ensure all live CTLD F10 menu entries are translated in Korean and Spanish instead of silently falling back to English.

Enhancements:

  • Complete KO and ES dictionary translations for all currently referenced keys, marking non-translatable sigils/placeholders as intentionally kept in English via __keep_en.
  • Document the i18n debt repayment lot in backlog and changelog, including scope and testing/acceptance details.

Documentation:

  • Add backlog PRD and ticket describing the FIX-I18N-DEBT-REPAYMENT lot, its scope, and acceptance criteria.
  • Update CHANGELOG with an unreleased entry noting KO/ES i18n debt repayment and its non-impact on tooling.

Tests:

  • Confirm via existing tooling and manual checks that no live empty entries remain in KO/ES dictionaries and that existing tests continue to pass.

Follow-up to FIX-I18N-DICT-GUARD (PR #115), which explicitly deferred
this work. 93 KO / 78 ES empty entries counted at merge; 23 / 8 turned
out to be STALE dead keys in CTLD_i18n_en.lua (no longer referenced by
src/), left untouched. The 70 live entries per language (same key set
for both) are now translated.

No ANTHROPIC_API_KEY was available, so translations were produced and
written directly rather than via translate_i18n.py - the script itself
is untouched, still the documented mechanism for next time.

JTAC and %1 [%2] %3. (no translatable content) added to each
dictionary's __keep_en block rather than left flagged as stubs
forever.

pytest tools/build/ 17/17 green; generate_i18n_dicts.ps1 dry-run
reports 0 MISSING. Lot: .backlog/FIX-I18N-DEBT-REPAYMENT/.
@FullGas1
FullGas1 requested a review from davidp57 as a code owner August 10, 2026 10:53
@sourcery-ai

sourcery-ai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Reviewer's Guide

This PR repays previously deferred KO/ES i18n translation debt by filling all live empty entries in the Korean and Spanish CTLD dictionaries, marking two non-translatable keys as keep-English, and documenting the work in the changelog and backlog PRD/ticket files, without changing any tooling or executable logic.

Flow diagram for KO/ES i18n debt repayment process

flowchart TD
    start([KO/ES dictionaries contain live empty entries])
    manual([Translate live empty entries directly in CTLD_i18n_ko.lua and CTLD_i18n_es.lua])
    keepEn(["Add JTAC and %1 [%2] %3. to __keep_en in both dictionaries"])
    result([KO/ES dictionaries have zero live empty entries outside __keep_en])

    start --> manual --> keepEn --> result
Loading

File-Level Changes

Change Details Files
Fill previously empty Spanish CTLD i18n entries and mark non-translatable keys as keep-English.
  • Replaced empty string values for ~70 live ES keys in CTLD_i18n_es.lua with Spanish translations, ensuring each key’s value is now non-empty where applicable.
  • Left STALE/dead keys untouched by only updating entries still referenced by ctld.tr()/config YAML.
  • Added JTAC and the placeholder-only "%1 [%2] %3." to the Spanish __keep_en block so they are treated as intentionally English while still satisfying stub detection.
src/CTLD_i18n_es.lua
Fill previously empty Korean CTLD i18n entries and mark non-translatable keys as keep-English.
  • Replaced empty string values for ~70 live KO keys in CTLD_i18n_ko.lua with Korean translations, ensuring each key’s value is now non-empty where applicable.
  • Left STALE/dead keys untouched by only updating entries still referenced by ctld.tr()/config YAML.
  • Added JTAC and the placeholder-only "%1 [%2] %3." to the Korean __keep_en block so they are treated as intentionally English while still satisfying stub detection.
src/CTLD_i18n_ko.lua
Document the i18n debt repayment lot in changelog and backlog artifacts.
  • Added a new Fixed section under Unreleased in CHANGELOG.md describing the KO/ES translation debt repayment and constraints.
  • Updated .backlog/README.md to register the FIX-I18N-DEBT-REPAYMENT lot with a short summary and branch name.
  • Introduced a new PRD file and ticket for FIX-I18N-DEBT-REPAYMENT describing the problem, solution, scope, and acceptance criteria without modifying any tooling behavior.
CHANGELOG.md
.backlog/README.md
.backlog/FIX-I18N-DEBT-REPAYMENT/PRD.md
.backlog/FIX-I18N-DEBT-REPAYMENT/tickets/01-repay-ko-es-i18n-debt.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've left some high level feedback:

  • There are still a few KO entries left as empty strings (e.g. Cannot build %1\n%2..., Drop Blue Smoke, Drop Crate(s)), so it’s worth double‑checking that each of these is genuinely non‑live or intentionally untranslated; if they are dead keys, consider marking them -- STALE: in the EN dict to keep the parser’s view consistent with reality.
  • Since %1 [%2] %3. is now both given an explicit value and marked in __keep_en, it might be clearer to add a short comment by that __keep_en entry explaining why it must remain identical to EN so future maintainers don’t try to “fix” it back into a stub.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- There are still a few KO entries left as empty strings (e.g. `Cannot build %1\n%2...`, `Drop Blue Smoke`, `Drop Crate(s)`), so it’s worth double‑checking that each of these is genuinely non‑live or intentionally untranslated; if they are dead keys, consider marking them `-- STALE:` in the EN dict to keep the parser’s view consistent with reality.
- Since `%1 [%2] %3.` is now both given an explicit value and marked in `__keep_en`, it might be clearer to add a short comment by that `__keep_en` entry explaining why it must remain identical to EN so future maintainers don’t try to “fix” it back into a stub.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant