Skip to content

Improve the German localization of Android onboarding - #1029

Merged
ryanbr merged 1 commit into
ryanbr:mainfrom
ben-tsk:agent/improve-german-onboarding
Aug 2, 2026
Merged

ryanbr merged 1 commit into
ryanbr:mainfrom
ben-tsk:agent/improve-german-onboarding

Conversation

@ben-tsk

@ben-tsk ben-tsk commented Aug 2, 2026

Copy link
Copy Markdown

What this PR does

Improves the German localization of the Android onboarding flow.

  • Moves previously hardcoded onboarding text into Android string resources
  • Adds and revises German translations with natural, consistent informal wording
  • Fixes incomplete and overly literal existing German translations
  • Adds the corresponding strings for the other supported Android locales to keep i18n coverage complete
  • Reuses localized onboarding strings in the changelog where applicable

No BLE, protocol, analytics, or application behavior is changed.

Type of change

  • Bug fix
  • New feature
  • Refactor / cleanup
  • Documentation
  • CI / tooling

How it was tested

  • ./gradlew assembleFullDebug
  • ./gradlew testFullDebugUnitTest
  • Repository i18n coverage audit for all supported Android locales
  • Repository source-hygiene check
  • Verified that all referenced string resources exist, contain no duplicate keys, and use compatible placeholders

The Android build, unit tests, i18n audit, and source-hygiene check all passed in GitHub Actions. No BLE code was modified, so real-hardware testing was not applicable.

Checklist

  • Swift package tests pass for any package I touched (swift test in Packages/<name>) — no Swift package was touched
  • Android unit tests pass if I touched android/ (./gradlew testFullDebugUnitTest)
  • No new build warnings introduced
  • UI changes use only StrandDesign tokens — no hardcoded colors, fonts, or spacing
  • No hardcoded hex frame bytes; protocol facts live in the schema / decoders
  • Follows the conventions in docs/CONTRIBUTING.md
  • I did not commit generated output (Strand.xcodeproj/) or any secrets/keystores

Related issues

None.

@ben-tsk
ben-tsk marked this pull request as ready for review August 2, 2026 01:23

@ryanbr ryanbr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good PR, and the premise checks out — the existing German was not merely stilted, it was broken. All checks green.

What was wrong before this:

  • Register mixed inside a single string. Kein WHOOP? **Du** kannst noch weitermachen. **Kombinieren Sie** einen Herzfrequenzgurt switches from du to Sie mid-sentence. Across the file it was Ein privates Fenster in **Ihre** Genesung next to all **deine** Daten.
  • Genesung for Recovery — that is convalescence from illness, not the fitness metric. Erholung is right.
  • Riemen for strap, a leather belt, where the rest of the app says Strap.
  • Leicht for the Light theme. That is light-as-in-easy, not light-as-in-bright — the theme picker was offering "Easy". Hell fixes a real mistranslation, not a nuance.

The new copy is consistent: across the 84 added German lines there are zero formal Sie/Ihr and 35 informal du/dein.

Verified rather than assumed:

  • Placeholders are safe. I checked all 83 string keys this PR touches, in all five locales. %1$d is present and correctly positioned everywhere and %% is properly escaped. (My first pass flagged onboarding_strap_bonded_battery in every locale; that was my own regex reading % b in %% battery as a specifier. False alarm.)
  • The AppChangelog.kt change is not what its filename suggests. Those four Expectation entries are onboarding cards consumed by OnboardingScreen.kt:429, and their titles were already localized — only the bodies were hardcoded English. Localizing them is the consistent thing, and onboarding_expectation_* is the right name. I went looking for a "localized historical changelog text" problem and there isn't one.
  • No hardcoded UI copy left behind in OnboardingScreen.kt.

One question, for a native speaker rather than me. Finde deinen Strap becomes Finde **dein** Strap, and Bevor du **dein** Strap verbindest is the same shape. Both are accusative, where a masculine Strap wants deinen. The catalogue is genuinely undecided — der Strap, den Strap, deinen Strap appear alongside das Strap — so this is not a clear error, and dein Strap is correct wherever it is nominative (Dein Strap ist gekoppelt). But if Strap is masculine, those two accusative uses regressed from something that was right. Worth settling the gender once and applying it, since you are already in here.

Nothing else blocking. Happy to merge on your word about the accusative.

@ryanbr
ryanbr merged commit 2c9a7e2 into ryanbr:main Aug 2, 2026
3 checks passed
@ben-tsk

ben-tsk commented Aug 2, 2026

Copy link
Copy Markdown
Author

@ryanbr
Thanks for flagging this. From a German speaker’s perspective, the grammatical gender of the English loanword “Strap” is not immediately obvious. It depends partly on what German term the reader associates it with: masculine terms such as “der Gurt”, “der Tracker” or “der Sensor” suggest “der Strap”, whereas neuter terms such as “das Band”, “das Gerät”, “das Armband” or “das Wearable” make “das Strap” feel plausible.

Actual German tech usage appears to lean towards the masculine form, but WHOOP’s own German copy largely avoids the ambiguity by referring to the product as “WHOOP”, “WHOOP-Gerät” or “Band”.

Before changing only the affected endings, could we therefore settle the intended terminology? WHOOP’s current English copy usually distinguishes between the WHOOP device or sensor and the band, although “WHOOP strap” still appears in some official copy.

Should NOOP keep “Strap” as its broader project-wide term and use the masculine form consistently in German, or should WHOOP-specific user-facing strings follow WHOOP’s current terminology more closely — for example “WHOOP” or “WHOOP-Gerät” — while reserving terms such as “heart-rate strap” for generic third-party devices?

Once that is decided, I can audit the affected German strings and prepare a consistent follow-up.

@ben-tsk

ben-tsk commented Aug 3, 2026

Copy link
Copy Markdown
Author

@ryanbr any news on this one?
After decision i would like to audit the affected strings, do a follow-up and also continue to improve German localization
Thank you so much in advance!

@ben-tsk
ben-tsk deleted the agent/improve-german-onboarding branch August 5, 2026 00:18
ryanbr pushed a commit that referenced this pull request Aug 16, 2026
Follows up #1029: 'der Strap' is masculine, so the nine accusative onboarding contexts take 'deinen Strap' (not 'dein Strap') and the pronoun 'es' becomes 'ihn'. Nominative/dative forms left untouched. Brings Android German into line with iOS, which already used the correct accusative. Android values-de only.
simoncad7 pushed a commit to simoncad7/noop that referenced this pull request Aug 17, 2026
The active repo is the fork now, so repoint the user-facing/functional github links (the update
check already pointed at ryanbr/noop):

Code (compiles; testcentre tests 108 pass):
- Settings → About "Project home & source" link (Android; iOS was already ryanbr).
- Bug-report "issues/new" URL + its tests/comments (Android + iOS).
- Donation link (Android + iOS) → ryanbr/noop/wiki/Donations.

Docs: README badges/links (releases, stars, wiki/FAQ, issues, clone, star-history), docs/IOS.md +
BUILD.md + CONTRIBUTING.md release links, docs/SAFEGUARDS.md operational gh command, and
altstore-source.json owner (host/path only — asset filenames untouched).

Deliberately LEFT as-is: the `NoopApplication` class name; provenance/credit comments (PR ryanbr#600,
ryanbr#569, ryanbr#554, ryanbr#1029, "reimplemented under NoopApp"); historical changelog entries (AppChangelog,
CHANGELOG.md, docs/releases/); and the `Copyright NoopApp` / PolyForm license attribution.
simoncad7 pushed a commit to simoncad7/noop that referenced this pull request Aug 17, 2026
The German onboarding copy mixed registers inside single strings ("Du kannst noch weitermachen. Kombinieren Sie..."), and carried real mistranslations: Genesung for Recovery (convalescence from illness, not the fitness metric), Riemen for strap, and Leicht for the Light theme - light-as-in-easy, so the theme picker offered "Easy".

Onboarding copy that was still hardcoded moves into string resources, the German is rewritten to consistent informal wording, and the other supported locales get the same keys so coverage stays complete. The four Expectation cards in AppChangelog.kt are onboarding content consumed by OnboardingScreen; their titles were already localized and only the bodies were hardcoded English.

No BLE, protocol or analytics behaviour changes. Placeholders verified across all 83 touched keys in five locales.
simoncad7 pushed a commit to simoncad7/noop that referenced this pull request Aug 17, 2026
Follows up ryanbr#1029: 'der Strap' is masculine, so the nine accusative onboarding contexts take 'deinen Strap' (not 'dein Strap') and the pronoun 'es' becomes 'ihn'. Nominative/dative forms left untouched. Brings Android German into line with iOS, which already used the correct accusative. Android values-de only.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants