Skip to content

Polish German Today localization - #2103

Open
bhelm wants to merge 4 commits into
ryanbr:mainfrom
bhelm:feature/deutsche-uebersetzung
Open

bhelm wants to merge 4 commits into
ryanbr:mainfrom
bhelm:feature/deutsche-uebersetzung

Conversation

@bhelm

@bhelm bhelm commented Sep 11, 2026

Copy link
Copy Markdown

Summary

  • make German Today/Home terminology consistent across Apple and Android
  • add missing localized customization and sync strings with correct plurals
  • replace mixed-language status/explanation copy and improve accessibility text
  • keep the German catalog canonical and add regression coverage

German language concept

  • NOOP scores: Energie, Belastung, Erholung
  • UI sections: Zusammenfassung, Wichtige Messwerte
  • training language: Training; hardware term: Strap; direct du-address
  • complete localized sentences, native plurals, and placeholder parity

Verification

  • python3 Tools/tests/test_german_today_localization.py
  • python3 Tools/test_home_i18n.py
  • python3 Tools/test_i18n_audit.py
  • python3 Tools/i18n_audit.py --ci origin/main
  • ./android/gradlew -p android :app:testFullDebugUnitTest --tests com.noop.ui.GermanLocalizationTest
  • independent final delta review: no remaining P0/P1 findings

@bhelm
bhelm marked this pull request as draft September 11, 2026 18:22
# Conflicts:
#	android/app/src/main/res/values-de/strings.xml
#	android/app/src/main/res/values-pl/strings.xml
#	android/app/src/main/res/values-ru/strings.xml
#	android/app/src/main/res/values-zh/strings.xml
@bhelm
bhelm marked this pull request as ready for review September 13, 2026 23:36
@bhelm

bhelm commented Sep 13, 2026

Copy link
Copy Markdown
Author

Reviewed on-device, looks good to my german eyes.

@ryanbr

ryanbr commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Thanks @bhelm. Reviewed the whole delta. The headline: the red check is not yours, and the two code changes are both genuine bug fixes. One blocking item on the new test file.

The failing check

parity-governance is the authority-staleness deadlock I filed as #2211, and it was repaired on main by your own #2212. This branch predates that, so it ran the pre-#2212 configuration (its log still prints expected at least 103 parity-governance tests).

I merged current main into your head locally: clean, zero conflicts. On that merged tree:

parity_ledger.py            OK  exit=0  (308 baselined, no NEW findings)
i18n_audit.py --ci main     OK  (no new English-only, no new non-focus gaps)
test_home_i18n.py           OK  (29 tests)
test_i18n_audit.py          OK  (42 tests)
GermanLocalizationTest      OK  (4 tests, 0 failures)

A rebase onto main clears the red. Nothing to change for it.

The two code changes are real fixes

Android, TodayScreen.kt. This was concatenating a localized string with a hardcoded English tail:

uiString(R.string.l10n_today_screen_baselines_learned_on_device_over_14_359f6812) +
    " signal against a typical adult range, not medical advice."

So every locale rendered that sentence half-translated, not just German. Routing the whole sentence through today_recovery_vitals_explanation is right, and you added it to base plus all 8 values* dirs, so there is no ExtraTranslation exposure at release lint.

iOS, TodayView.swift. "Syncing strap history, chunk \(n)" to "Syncing strap history, \(n) chunks" looked cosmetic, so I checked the catalogue: the new key carries full plural variations in all 10 locales, with correct Polish and Russian few/many, and the old key is gone rather than orphaned. That turns "1 chunks" into proper inflection and lines the label up with its existing sibling Syncing strap history, %lld chunks, %@. Good catch.

Blocking: the new test file never runs

Tools/tests/test_german_today_localization.py is pytest-style (8 bare def test_*() with plain asserts, one taking a tmp_path fixture). It has no unittest.TestCase and no if __name__ == "__main__" guard, and pytest is not a dependency here. Result:

$ python3 Tools/tests/test_german_today_localization.py     # your listed verification step
exit=0                                                       # ran zero assertions

$ python3 -m unittest discover -s Tools/tests -p 'test_german*'
Ran 0 tests in 0.000s
NO TESTS RAN

tools-python.yml discovers via unittest discover, so CI collects nothing from it either, and the collection floor stays satisfied by the other files, so nothing goes red to tell you. The "regression coverage" bullet is not actually wired up. Converting to unittest.TestCase in the shape of the sibling Tools/tests/test_parity_ledger.py gets all 8 running (the one fixture case can use tempfile.TemporaryDirectory).

Worth doing rather than dropping, because one of those 8 would have caught the next item.

Non-blocking

German terminology splits on the exact concept this PR is about. After the change:

where German
iOS Syncing strap history, %lld chunks (new) Datenblock / Datenblöcke
iOS Syncing strap history, %lld chunks, %@ Chunk / Chunks
Android sync_chip_chunks_count Chunk / Chunks

Two adjacent VoiceOver labels for the same thing now disagree, and Android disagrees with iOS. Your test_..._german_data_block_terms pins the new wording, which is exactly the test that is currently inert. Pick one term and apply it to all three.

8 dead strings. l10n_today_screen_baselines_learned_on_device_over_14_359f6812 is no longer referenced from any Kotlin or Swift, but still sits in base and all 7 translated values* files. Not fatal, just worth sweeping while you are in there.

What I checked mechanically

  • Placeholder integrity across all 3,805 German catalogue entries (arity, index set, and type family, positional %1$@ conversions treated as equivalent): 0 real defects. The 178 raw diffs are all ordered-to-positional rewrites, which is correct for German word order.
  • ExtraTranslation and resource-type mismatches across all 8 values* dirs: 0. German is short only app_name, which is intentional.
  • No German key is deleted without being re-added.

What I cannot check

German prose quality. The terminology table above is a consistency observation, not a judgement on which wording reads better, and I will take your call on it.

Rebase, convert the test, and I will merge.

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