Languages and localization
Keep interface, native permissions, notifications, legal pages, and store copy aligned.
English and Spanish already work across the app. The starter uses i18next, typed resources, locale-aware formatting, and a persisted language preference.
Add a language
Add [language] to this product. Read agent-skills/add-i18n.md first. Translate
every visible key, native permission string, notification variant, legal page,
and store-facing copy. Use locale-aware numbers, dates, and plurals. Test text
expansion, Dynamic Type, forms, errors, paywalls, and screen-reader pronunciation.The files that matter
src/i18n/resources.ts: supported languages and app strings.src/i18n/index.ts: initialization and preference behavior.locales/en.jsonandlocales/es.json: native app name and permission copy.legal-site: public privacy, terms, support, accessibility, and deletion pages.- backend push/email copy: content delivered when the app is not rendering it.
Rules that prevent awkward translations
- Do not build sentences by joining English fragments.
- Use interpolation for values and
Intlfor numbers, dates, and plurals. - Store machine values, not already-formatted strings.
- Test long words, multiline actions, keyboard overlap, and the largest practical text size.
- For RTL, use logical start/end alignment and test a clean reinstall because native RTL state can persist.
- Localize store screenshots and metadata separately; in-app translation does not update App Store Connect or Play Console.
Verification prompt
Search route and component source for hard-coded visible strings. Walk every
primary, empty, error, permission-denied, purchase, and deletion path in each
language. Report anything untranslated or clipped before calling it complete.