Kristopher Baker iOS roots · Product systems · AI-assisted workflows
← Aoede

shipped · 2026.06.07 · 1 min read

Localizing the App Without Translating the Books

Reading Japanese aloud is what I'm working on now. Before the voice gets there, the interface itself should speak Japanese, so that came first. Every user-facing string is now localizable through String Catalogs, with a full Japanese translation covering the UI, onboarding, reader, settings, and even the four reading-theme names. The catalogs extract at build time, so new Text and Button literals get picked up automatically instead of quietly shipping in English.

The harder part was the strings that looked localized but were not. A book's title is content, not UI, and must never be translated, so anywhere a label mixed a literal with runtime content (the reader title, the chapter menu, the download progress) I split them apart, leaving only the literal to go through the catalog while the content stays verbatim. The work also went down into the Swift packages: DocumentKit and SpeechKit now conform their import and synthesis errors to LocalizedError. So instead of the generic "operation couldn't be completed," a failed import explains itself in the reader's own language.

Localization sounds mechanical until you realize half the challenge is deciding what not to translate.