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: all UI text in the catalog,
orphan-strings reports nothing, app checked in de and en. “No
hardcoded texts” is no style preference — it 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 caveat stands 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 delivers: 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.