Appearance
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
enandcs.
Approved locales
| Setting | Value |
|---|---|
| Launch countries | Czech Republic only (Apple App Store and Google Play) |
| App/store languages | English (primary/default) + Czech (required parity) |
| Keryx Flutter supported locales | en, cs |
| SafeCall web admin locales | en, cs (via lib/src/locale.ts) |
Missing Czech parity on any required surface blocks launch (P0-02).
Product naming
| Context | English | Czech |
|---|---|---|
| Store / in-app product name | Keryx for SafeCall | Keryx pro SafeCall |
| Launcher / home-screen label | Keryx | Keryx |
| Publisher | sourcectl | sourcectl |
See visual identity for mark and hierarchy rules.
Fallback policy
| Surface | Resolution | Fallback |
|---|---|---|
| Keryx Flutter UI | Device locale via MaterialApp | en when locale unsupported or ARB key missing |
| iOS permission strings | InfoPlist.strings per language | Base Info.plist English |
| Android labels / FGS copy | values/ + values-cs/ resources | English values/ |
| SafeCall web admin | Active site locale from user/session | Catalog English value |
| QR embedded alert labels | Admin UI locale at QR generation time | Must not use raw server English labels when admin locale is cs |
| Store listing fields | Paste from store listing copy | N/A (both locales required in packet) |
| Public web landing | public web pages EN/CS blocks | Deploy 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
| English | Czech | Notes |
|---|---|---|
| Active | Aktivní | Keryx tab |
| Archive | Archiv | Keryx tab |
| Settings | Nastavení | |
| Scan QR code | Naskenovat QR kód | Primary CTA |
| Pause notifications | Pozastavit upozornění | |
| Resume notifications | Obnovit upozornění | |
| Notification details | Podrobnosti upozornění | |
| SafeCall alerts | Upozornění SafeCall | Channel / notification family name |
| Respect SafeCall | Řídit se nastavením SafeCall | Default Keryx cadence |
| Waiting for status | Čeká se na stav | Do 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 clear | Vše v pořádku | Only after an explicit SafeCall state record |
| Admin features | Funkce správce | Collapsed Mobile Access section |
| Known devices | Známá zařízení | Devices learned from SafeCall alert records |
Friendly alert categories
Canonical trigger, tag, and cadence tables: SafeCall ntfy / Keryx alert topics.
| Topic id | English | Czech |
|---|---|---|
| sensors | Sensor threshold alerts | Prah senzoru |
| sos | Panic button alerts | Poplachové tlačítko |
| watches | Watch button alerts | Poplachové tlačítko hodinek |
| batteries | Low battery alerts | Slabá baterie |
| notseen | Device not seen alerts | Zařízení neviděno |
| calibration | Calibration expiry | Vypršení kalibrace |
| test | Notification pipeline tests | Testy kanálu oznámení |
| health | Installation health alerts | Stav 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
| Surface | Source of truth | Locales in source |
|---|---|---|
| Keryx Flutter UI | keryx/l10n/app_{en,cs}.arb | en, cs |
| Keryx generated l10n | keryx/lib/l10n/ (gen-l10n) | en, cs |
| iOS permissions | Info.plist + cs.lproj/InfoPlist.strings | en, cs |
| Android app label | values/strings.xml, values-cs/strings.xml | en, cs |
| Android FGS / ntfy vendor | values*/ntfy_strings.xml | en, cs |
| SafeCall admin provisioning | lib/src/ui_translation_*_catalog.ts | en, cs (EXACT_CZECH) |
| Store listing fields | store-listing-copy.md | en, cs |
| Store screenshot captions | store-screenshot-kit.md | en, cs |
| Public install landing | public-web-pages.md | en, cs |
| Legal DRAFT | legal/ | en + cs DRAFT sections |
| Release notes templates | store-listing-copy.md | en, cs |
Translation update workflow
Keryx Flutter
- Edit
keryx/l10n/app_en.arb(canonical English). - Mirror every key in
app_cs.arbwith reviewed Czech. - Run
flutter gen-l10n(orflutter pub getwithgenerate: true). - Replace hard-coded literals with
AppLocalizations.of(context)!. - Run
cd keryx && flutter analyze && flutter test(includes ARB parity test).
SafeCall web admin
- Add or update keys in
lib/src/ui_translation_english_catalog.ts. - Add matching
EXACT_CZECHentries inui_translation_czech_catalog.tsfor all Keryx/provisioning keys (no heuristic-only Czech on these surfaces). - Wire keys in
web/src/admin/tools/mobile-access/viat()anddata-i18n-key. - Add a seed migration that upserts the new or changed keys into
ui_translation_keys/ui_translation_stringsforenandcs(catalogs alone do not update upgraded databases). - Run
bun scripts/i18n/audit.tsandcd web && bun run typecheck. - Update E2E expectations in
web/tests/e2e/mobile-access.spec.tswhen 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 bareSafeCall - [ ] 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 work | Owner 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 CS | P1-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.