Skip to content

i18n: add Dutch localization to the Apple apps - #2866

Open
Lukasjoosten wants to merge 1 commit into
ryanbr:mainfrom
Lukasjoosten:i18n/dutch-apple
Open

Lukasjoosten wants to merge 1 commit into
ryanbr:mainfrom
Lukasjoosten:i18n/dutch-apple

Conversation

@Lukasjoosten

Copy link
Copy Markdown

Refs #2864

Adds Dutch (nl) to the Apple apps (macOS, iOS, watchOS), as the counterpart of the Android Dutch localization in #2865. It follows the shape of the Italian localization (#2454).

What changes

  • Catalogs: every translatable key gains an nl unit in Strand (4126), StrandDesign (57), NOOPWatch (69) and NOOPWatchComplications (30). Keys with plural variations in any locale get Dutch one/other forms (79 keys).
  • Reuse: about 1,400 strings reuse the reviewed Android Dutch wherever the English source is identical. Android placeholders are mapped to the Apple shapes (%1$s → %@, %1$d → %lld, positional only where Dutch reorders arguments).
  • AppLanguage: gains case dutch = "nl" after italian, with the autonym "Nederlands", and a test mirroring the Italian one.
  • Baselines: i18n_extra_locale_baseline.txt gets nl 0 for all four catalogs, so Dutch fails CI on any new English-only string. i18n_echo_baseline.txt gets Strand … nl 27 and NOOPWatchComplications … nl 2.

Verification

  • Every translatable key has a translated nl unit.
  • For every form, the placeholder multiset matches the key and the %% counts match.
  • Newline counts match the English. The exception is three tempo strings ("Regular tempo…", "Mid session tempo…", "Punching Through…"): only their English value carries a leading \n\n that no other locale has, so the Dutch follows the key and the other locales.
  • All plural keys have one and other, and all four catalogs parse as JSON.
  • No re-serialisation: the catalogs were appended rather than re-serialised, and removing the inserted text reproduces the original bytes. 411 entries in Strand sit on a single line, so they are necessarily edited in place (insertion only). Everything else is pure line additions.
  • Echo counts: recomputed with the audit's own predicate. Each entry is a brand, a metric abbreviation, a proper name kept as on Android (Presence, Wim Hof), or wording that is already correct Dutch ("%@ in bed", "Per extra %@").
  • i18n_audit.py --ci upstream/main: clean for nl. Locally on Windows the only FAIL/STALE pairs are the known \ vs / path artifact for ru and zh-Hant.
  • unittest discover -s Tools: 338 tests, with the same 4 test_check_source_references failures as a clean upstream/main copy on the same Windows machine.
  • Swift not compiled locally: the changes were made on Windows without Xcode, so AppLanguage.swift and AppLanguageTests.swift are validated only by app-build.yml on this PR.

Translation

The translations were machine-assisted against a fixed glossary and reviewed by a native Dutch speaker (the PR author). The glossary is the one approved for the Android half: informal "je", sentence case, NOOP's own Charge/Effort/Rest → Lading/Inspanning/Rust, kept distinct from the WHOOP terms Recovery/Strain → Herstel/Belasting.

Noticed while translating (not changed here)

  • Two Fitness Age accessibility labels interpolate an English-only plural "s" into the localized string (yr%@, year%@), so non-English locales get a stray suffix.
  • MarkerEditorView parses values with Double(_:), which rejects a decimal comma, so the Dutch hint keeps "bijv. 3.1". This affects every comma-decimal locale.

🤖 Generated with Claude Code

Adds Dutch as a complete, selectable language on macOS, iOS and watchOS, as the
Apple counterpart of the Android Dutch localization, following the shape of the
Italian one (ryanbr#2454).

Every translatable key in the four catalogs gains an `nl` unit: Strand (4126),
StrandDesign (57), NOOPWatch (69) and NOOPWatchComplications (30). Keys that
carry plural variations in any locale get Dutch `one`/`other` forms (79).
About 1,400 strings reuse the reviewed Android Dutch wherever the English source
is identical, with Android placeholders mapped to the Apple shapes; the rest
were translated against the same glossary. `AppLanguage` gains the case and the
autonym "Nederlands", with a test mirroring the Italian one.

Verified mechanically:

- every translatable key has a translated `nl` unit; the placeholder multiset of
  every form matches the key, `%%` counts match, and newline counts match the
  English (three tempo strings whose English value alone carries a leading
  "\n\n" follow the key and the other locales instead)
- the catalogs were appended rather than re-serialised: removing the inserted
  text reproduces the original bytes. 411 single-line Strand entries are
  necessarily edited in place; everything else is pure line additions
- the echo baselines were recomputed with the audit's own predicate: 27 for
  Strand and 2 for NOOPWatchComplications, each a brand, a metric abbreviation,
  a proper name kept as on Android, or wording that is already correct Dutch
- the extra-locale allowances for `nl` start at 0 in all four catalogs

The translations were machine-assisted against a fixed glossary and reviewed
by a native Dutch speaker.

Refs ryanbr#2864

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant