hoangsonww / hoangsonww/Diffuse-Native-Apps
Localise the five apps — every user-facing string is currently hardcoded English
- Dominant language
- Swift
- Stars
- 2
- Forks
- 0
- Avg merge
- 1h 53m
- Merged PRs (30d)
- 14
Description
## Motivation
There is not one `.strings`, `.stringsdict`, or `.xcstrings` file anywhere in `Packages/` or `Apps/`, and `Android/app/src/main/res/` has only a default `values/strings.xml`. Every label, severity name, empty state, privacy classification, and retention description is an English literal compiled into the binary.
Diffuse already does the hard part of internationalisation correctly: dates and byte counts go through `Date.formatted` and `Measurement`, which respect the user's locale. The Android app even collects locale as an observation. So a user in France sees correctly formatted dates surrounded entirely by English chrome — which is a worse impression than not localising at all, because it looks unfinished rather than deliberate.
## Proposed Solution
Adopt String Catalogs (`.xcstrings`) in `DiffuseUI` and each Apple app target, and migrate Android to per-locale `values-/strings.xml`. The mechanical work is extracting literals; the interesting work is the schema-driven surfaces, where `displayName`, `summary`, and severity/classification labels travel *inside the snapshot* and must stay stable identifiers on the wire while being presented through a localised lookup.
That distinction matters for correctness: a snapshot captured in one locale and opened in another must render in the reader's language, so the persisted value has to remain the stable key, never the translated string.
## Acceptance Criteria
- [ ] All user-facing strings in `DiffuseUI` and the four Apple targets move into String Catalogs
- [ ] Android strings move into `values/strings.xml` with at least one additional locale wired up
- [ ] Schema-carried identifiers stay untranslated on disk; only presentation is localised
- [ ] A snapshot captured under one locale renders correctly under another — covered by a test
- [ ] Pseudolocalisation run to catch truncation, especially on watchOS
- [ ] RTL layout verified; Android already sets `supportsRtl="true"`
## Additional Context
Related surfaces: `Packages/DiffuseUI/Sources/DiffuseUI/`, `Android/app/src/main/res/values/strings.xml`, `Documentation/SnapshotSchema.md`.
Contributor guide
Assessment
This issue has not been assessed yet.