Skip to content

Keryx localization policy

Approved: 26 August 2026

This document is the P2-05 localization packet for Keryx for SafeCall: owned locale policy, terminology glossary, fallback rules, surface matrix, and translation/release workflow.

It does not claim counsel-reviewed Czech legal HTML, live Czech HTTPS pages, store console paste, Czech screenshot PNG exports, or verified public contacts.

Purpose and non-goals

Purpose

  • Define English and Czech as the required launch locales (P0-02 / #90).
  • Record canonical product naming, friendly alert-category wording, and prohibited ordinary-administrator ntfy/topic jargon.
  • Map every user-facing surface to its localization source in source control.
  • Document update and validation workflow for Keryx Flutter ARB files and SafeCall web UI catalogs.

Non-goals

  • Publishing Czech HTML to {public_base} (#107 deploy).
  • Exporting localized store screenshot PNGs (#106 / #123).
  • Pasting localized listings into App Store Connect or Play Console (#125).
  • Counsel sign-off on Czech legal DRAFT bodies.
  • Adding locales beyond en and cs.

Approved locales

SettingValue
Launch countriesCzech Republic only (Apple App Store and Google Play)
App/store languagesEnglish (primary/default) + Czech (required parity)
Keryx Flutter supported localesen, cs
SafeCall web admin localesen, cs (via lib/src/locale.ts)

Missing Czech parity on any required surface blocks launch (P0-02).

Product naming

ContextEnglishCzech
Store / in-app product nameKeryx for SafeCallKeryx pro SafeCall
Launcher / home-screen labelKeryxKeryx
Publishersourcectlsourcectl

See visual identity for mark and hierarchy rules.

Fallback policy

SurfaceResolutionFallback
Keryx Flutter UIDevice locale via MaterialAppen when locale unsupported or ARB key missing
iOS permission stringsInfoPlist.strings per languageBase Info.plist English
Android labels / FGS copyvalues/ + values-cs/ resourcesEnglish values/
SafeCall web adminActive site locale from user/sessionCatalog English value
QR embedded alert labelsAdmin UI locale at QR generation timeMust not use raw server English labels when admin locale is cs
Store listing fieldsPaste from store listing copyN/A (both locales required in packet)
Public web landingpublic web pages EN/CS blocksDeploy chooses locale path or hreflang (#107)

Technical token rules

Do not translate or paraphrase in ordinary administrator UI:

  • ntfy server URLs, topic IDs (TST000-sos), bundle IDs, JSON field names
  • subscribe_auth, ntfy message IDs, raw notification JSON keys
  • Internal API paths and debug correlation tokens

Friendly alert category labels (translated) replace topic jargon in provisioning UI, Keryx list titles (from QR labels), and store screenshots.

Hide topic IDs and server URLs from ordinary Keryx and admin UI per store screenshot kit.

Terminology glossary

Core UI

EnglishCzechNotes
ActiveAktivníKeryx tab
ArchiveArchivKeryx tab
SettingsNastavení
Scan QR codeNaskenovat QR kódPrimary CTA
Pause notificationsPozastavit upozornění
Resume notificationsObnovit upozornění
Notification detailsPodrobnosti upozornění
SafeCall alertsUpozornění SafeCallChannel / notification family name
Respect SafeCallŘídit se nastavením SafeCallDefault Keryx cadence
Waiting for statusČeká se na stavDo not translate as “OK”
SafeCall has not delivered a status snapshot yet. Open Keryx after you scan, or wait for the next daily digest if this phone was offline.SafeCall zatím nedoručil snímek stavu. Otevřete Keryx po naskenování, nebo počkejte na další denní souhrn, pokud byl telefon offline.Keep the daily-digest caveat; do not imply the category is already OK
All clearVše v pořádkuOnly after an explicit SafeCall state record
Admin featuresFunkce správceCollapsed Mobile Access section
Known devicesZnámá zařízeníDevices learned from SafeCall alert records

Friendly alert categories

Canonical trigger, tag, and cadence tables: SafeCall ntfy / Keryx alert topics.

Topic idEnglishCzech
sensorsSensor threshold alertsPrah senzoru
sosPanic button alertsPoplachové tlačítko
watchesWatch button alertsPoplachové tlačítko hodinek
batteriesLow battery alertsSlabá baterie
notseenDevice not seen alertsZařízení neviděno
calibrationCalibration expiryVypršení kalibrace
testNotification pipeline testsTesty kanálu oznámení
healthInstallation health alertsStav instalace

Descriptions for admin provisioning use matching Czech catalog keys (admin.ntfy_topics.{id}_description).

Prohibited ordinary-admin phrasing

Replace user-visible strings that say topic, ntfy, or subscribe to topics with alert category / kategorie upozornění wording. Debug/diagnostic surfaces may retain technical labels when debug_access is enabled.

Surface matrix

SurfaceSource of truthLocales in source
Keryx Flutter UIkeryx/l10n/app_{en,cs}.arben, cs
Keryx generated l10nkeryx/lib/l10n/ (gen-l10n)en, cs
iOS permissionsInfo.plist + cs.lproj/InfoPlist.stringsen, cs
Android app labelvalues/strings.xml, values-cs/strings.xmlen, cs
Android FGS / ntfy vendorvalues*/ntfy_strings.xmlen, cs
SafeCall admin provisioninglib/src/ui_translation_*_catalog.tsen, cs (EXACT_CZECH)
Store listing fieldsstore-listing-copy.mden, cs
Store screenshot captionsstore-screenshot-kit.mden, cs
Public install landingpublic-web-pages.mden, cs
Legal DRAFTlegal/en + cs DRAFT sections
Release notes templatesstore-listing-copy.mden, cs

Translation update workflow

Keryx Flutter

  1. Edit keryx/l10n/app_en.arb (canonical English).
  2. Mirror every key in app_cs.arb with reviewed Czech.
  3. Run flutter gen-l10n (or flutter pub get with generate: true).
  4. Replace hard-coded literals with AppLocalizations.of(context)!.
  5. Run cd keryx && flutter analyze && flutter test (includes ARB parity test).

SafeCall web admin

  1. Add or update keys in lib/src/ui_translation_english_catalog.ts.
  2. Add matching EXACT_CZECH entries in ui_translation_czech_catalog.ts for all Keryx/provisioning keys (no heuristic-only Czech on these surfaces).
  3. Wire keys in web/src/admin/tools/mobile-access/ via t() and data-i18n-key.
  4. Add a seed migration that upserts the new or changed keys into ui_translation_keys / ui_translation_strings for en and cs (catalogs alone do not update upgraded databases).
  5. Run bun scripts/i18n/audit.ts and cd web && bun run typecheck.
  6. Update E2E expectations in web/tests/e2e/mobile-access.spec.ts when EN copy changes.

See also i18n locale workflow for promoted locales.

Cross-surface parity checklist (pre-store)

  • [ ] Keryx app bar shows Keryx for SafeCall / Keryx pro SafeCall, not bare SafeCall
  • [ ] Onboarding states SafeCall contract dependency (EN + CS)
  • [ ] Admin provisioning uses friendly categories; topic IDs not visible
  • [ ] QR generated under Czech admin locale embeds Czech labels
  • [ ] iOS/Android permission strings match apple privacy compliance
  • [ ] Store listing CS fields match in-app/provisioning terminology
  • [ ] Legal CS DRAFT sections present; counsel review tracked separately

Evidence handoff (after #108)

Remaining workOwner issue
Czech screenshot PNG capture#106 / #123
HTTPS Czech public HTML#107 deploy
Store console localized paste#125
Controlled {public_base} and contacts#114
Counsel review of legal CSP1-06 / launch authority

Launch posture

Closing P2-05 / #108 means EN/CS strings are implemented in source for app, provisioning, platform permissions, and legal DRAFT bodies. It does not mean store listings are live, Czech HTTPS resolves, screenshots are exported, or counsel approved publication.