You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Found while fixing #540 (the i18n audit's blindness to conditionally-hidden literals). This is a different, separate bug: a resource string engineered to end mid-sentence, concatenated with a hardcoded English literal tail.
The pattern
Text(
uiString(R.string.l10n_add_device_wizard_noop_will_install_its_own_key_d3f6321e) +"longer control this ring. This is intended and it cannot be undone from NOOP.",
...
)
strings.xml confirms this is deliberate, not accidental — the resource itself is truncated mid-sentence with a trailing space:
<stringname="l10n_add_device_wizard_noop_will_install_its_own_key_d3f6321e">NOOP will install its own key on the ring. If you ever want to go back to the official Oura app, or the ring stops responding, factory-reset it and it will no </string>
The resource-backed prefix is properly localized. Only the hardcoded suffix ("longer control this ring..." above) is not — it ships in English regardless of device language.
Scale
grep -rn 'uiString(R\.string\.[a-zA-Z0-9_]*)\s*+\s*$' android/app/src/main/java/com/noop/ui/ finds 86 occurrences across 28 files. AddDeviceWizard.kt alone has several (lines 619, 751, 795, 833, 1164, and more) — the device-pairing wizard's instructional copy is the heaviest user of this pattern, but it's spread across most of the Compose UI layer, not concentrated in one screen.
Why this is its own issue rather than folded into #540
#540's scanner fix deliberately does not flag +-concatenated literals (a literal whose nearest preceding token is + is skipped by design) — closing that class of bug needs real new translation content for each suffix, in German/Spanish/French, at a scale (86 sites) that doesn't fit "reuse an already-translated value" the way most of #540's backlog does. Rushing that risks exactly the "unreviewed machine output" problem raised in #543.
Suggested approach
For each site: either (a) extend the resource string to cover the full sentence and drop the hardcoded suffix, or (b) split the suffix into its own resource key. Either way it needs an actual DE/ES/FR translation for the suffix content, not just a mechanical wrap — a native-speaker pass (or a native contributor working through it a few files at a time) is the realistic path here, not a single bulk PR.
Verified fixed: 0 remaining uiString(...) + "<English tail" concatenations in Android sources (grep confirms). All hardcoded English suffixes have been replaced with proper localized strings.
Activity
i18n_audit: catch UI literals hidden behind if/else, when, and .let (#…
Apply native-speaker corrections to three of the German strings (ryan…
Android i18n: complete 7 truncated wizard strings from the Apple cata…
i18n_audit: catch UI literals hidden behind if/else, when, and .let (r…
Android i18n: complete 7 truncated wizard strings from the Apple cata…
Android: complete 16 half-English paragraphs from the Swift catalogue (…
i18n_audit: catch UI literals hidden behind if/else, when, and .let (r…
Android i18n: complete 7 truncated wizard strings from the Apple cata…
Android: complete 16 half-English paragraphs from the Swift catalogue (…
sleep: drag the hypnogram to read the clock time under your finger
sleep: drag the hypnogram to read the clock time under your finger
sleep: drag the filled hypnogram to read the clock time under your fi…
sleep: drag the filled hypnogram to read the clock time under your fi…
evoveotech commentedon Sep 10, 2026
Verified fixed: 0 remaining
uiString(...) + "<English tail"concatenations in Android sources (grep confirms). All hardcoded English suffixes have been replaced with proper localized strings.