Localization
4Notice ships in seven languages: en, de, fr, es, it, ja, zh-Hans. The whole step was one ticket and one commit (“Localize the UI into seven languages”) — because the groundwork made it mechanical.
1. One catalog, no hardcoded strings
Section titled “1. One catalog, no hardcoded strings”All UI text lives in a string catalog
(Resources/Localizable.xcstrings) — for 4Notice, 30 keys. The
supported languages are declared once, in project.yml, so the
generated Xcode project always agrees:
options: developmentLanguage: en knownRegions: [en, de, fr, es, it, ja, zh-Hans]The ticket’s acceptance criteria said it plainly: all UI text in the
catalog, orphan-strings reports nothing, app checked in de and en.
“No hardcoded texts” is not a style wish — it’s what makes the next
two steps checkable.
2. The agent translates — with a marked caveat
Section titled “2. The agent translates — with a marked caveat”The translations themselves were agent work, all seven languages in one run. The honest part is in the ticket’s notes, verbatim:
ja/zh-Hans are agent translations — have them proofread once before the store.
That’s the pattern for using an agent on judgment work: take the speed, record the uncertainty where it will be seen again (the ticket), and schedule the human check before it matters (the store listing, not the commit).
3. Prove there are no leftovers
Section titled “3. Prove there are no leftovers”Here the imported release-checks skill
pays off. orphan-strings — one of the three tools the agent
implemented and verified earlier — lists every catalog key that no
Swift source references literally:
echo '{"catalog": "Resources/Localizable.xcstrings", "sources": ["Sources"]}' \ | python3 .agent/tools/orphan-strings/macos.py# → {"ok": true, "orphans": []}An empty list is the goal, but a non-empty one is candidates, not facts — a key built by string interpolation shows up here too, so each hit gets confirmed before deletion (the skill says so; that’s why it reports instead of fixing).
For 4Notice: no orphans, visual check in German and English, ticket
Done. Store metadata per language is a separate concern — it
belongs to fastlane, where screenshots
for all seven languages are generated in one automated run.