Skip to content

Correct 31 French translations from a native-speaker review (#884) - #919

Merged
ryanbr merged 1 commit into
mainfrom
l10n/fr-corrections-884
Jul 28, 2026
Merged

Correct 31 French translations from a native-speaker review (#884)#919
ryanbr merged 1 commit into
mainfrom
l10n/fr-corrections-884

Conversation

@ryanbr

@ryanbr ryanbr commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Part of #884 — the issue stays open; see the completeness note at the end. @NoBrainNoHeadache — a native French speaker, first contribution — reviewed the catalogue's French and attached a corrected file. This applies it as a cherry-pick of exactly the 31 changed fr entries, not the wholesale file, for two reasons found in review:

What it fixes

Not polish — machine-translation output that was wrong to the point of nonsense:

key old French which means
RESTORATIVE SLEEP POULET RESTORATOIRE restorative chicken
"one-glance read" lecture d'un verre reading of a drinking glass
"Deep sleep pools HRV" piscines de sommeil swimming pools of sleep
HOURS OF SLEEP HORAIRES DE DOUCEE not a French word
RECOVERY RECOUVREMENT debt collection — the same error #902 found in Android's catalogue exists here too

Plus consistent terminology: HRV → VFC everywhere (replacing the invented VHR/VRH), RHR → FCR, strap → bracelet (replacing bande/sangle).

The change verified against code, not language

The bare "W"/"M" keys. Every localized use is case .week / case .month in seven range pickers — so their W→S (Semaine) / M→M (Mois) is correct, and the old French had M→L (someone's Monday→Lundi guess): French users have been seeing an L on a Month toggle. A translation fix that is also a UI bug fix.

Two integration repairs, both mechanical

  1. The Charge explainer carried %6$lldcalculée — a positional %6$ against an English string with a single argument, so String(format:) reaches for a sixth argument that does not exist. Correction to an earlier revision of this description: the %6$ is NOT from the contributor's edit or Xcode's editor — it is on main today, and not only in French: German and Spanish carry the identical broken specifier (pt-PT is already correct). All three are repaired here to %lld (fr also gains its missing space); the es prose around it has separate MT damage (« de vez en cuando » for "from time in zones") noted on French translation updates and corrections for Localizable.xcstrings #884 rather than touched here.
  2. All 31 arrived state=needs_review, which Tools/i18n_audit.py counts as untranslated — a straight merge would have hard-failed the fr focus-locale gate. Flipped to translated after reading all 31.

Verification

  • Diff is 31 value lines and nothing else — checked, not assumed; serialization confirmed byte-stable before writing.
  • Format specifiers verified preserved on the other 30.
  • Only fr differs from main; no other locale touched.
  • i18n --ci passes.

Completeness (added after a scoping re-check)

  • +2 strings from the StrandDesign catalogue, same error class found by sweeping the other three Apple catalogues: GRADIENTS DE RECOUVREMENTGRADIENT DE RÉCUPÉRATION, and Plongez pour lire le VHR ("dive to read") → Survolez pour lire la VFC. The two Watch catalogues are clean.
  • Not in this PR, still open on French translation updates and corrections for Localizable.xcstrings #884: (a) the contributor also translated 209 un-extracted keys Xcode pulled from source — real work, preserved on the issue, adoptable only when those strings are extracted with the other focus locales filled; (b) Android'''s French has the same error classes at larger scale — VHR×7, RECOUVREMENT×1, sangle×80, bande×6 — and the sangle→bracelet sweep flips grammatical gender, so it needs a careful pass, not a sed.

@ryanbr
ryanbr force-pushed the l10n/fr-corrections-884 branch 2 times, most recently from 1ee4aa9 to 104acea Compare July 28, 2026 04:11
@NoBrainNoHeadache — a native French speaker, first contribution — reviewed the
Apple catalogue's French and attached a corrected file to #884. Applied here as
a cherry-pick of exactly the 31 changed fr entries onto current main, not as the
wholesale file: their base predated #890 (4 keys would have been deleted) and
Xcode's re-extraction had added 209 keys the catalogue deliberately does not
carry.

What the corrections fix is not polish, it is machine-translation output that
was wrong to the point of nonsense:

  RESTORATIVE SLEEP    "POULET RESTORATOIRE"    (restorative CHICKEN)
  one-glance read      "lecture d'un verre"     (reading of a drinking GLASS)
  Deep sleep pools HRV "piscines de sommeil"    (SWIMMING POOLS of sleep)
  HOURS OF SLEEP       "HORAIRES DE DOUCEE"     (not a French word)
  RECOVERY             "RECOUVREMENT"           (debt collection — the same
                                                 error #902 found in Android's
                                                 catalogue exists here too)

Plus consistent terminology: HRV is now VFC (variabilité de la fréquence
cardiaque) everywhere instead of the invented VHR/VRH, RHR is FCR, and the
strap is "bracelet" rather than "bande"/"sangle".

The one change verified against code rather than language: the bare "W" and "M"
keys. Every localized use is `case .week` / `case .month` in seven range
pickers, so their W→"S" (Semaine) / M→"M" (Mois) is right — and the OLD French
had M→"L", someone's guess at Monday→Lundi, so French users saw an L on a Month
toggle. A translation fix that is also a UI bug fix.

Two integration repairs, both mechanical:

  - One entry arrived as "%6$lldcalculée": a positional %6$ against an English
    string with a single argument (String(format:) would reach for a sixth that
    does not exist — French-only runtime breakage, most likely Xcode's editor
    numbering around the %% escapes), and a missing space. Now "%lld calculée".
  - All 31 arrived state=needs_review, which Tools/i18n_audit.py counts as
    untranslated — a straight merge would have hard-failed the fr focus-locale
    gate. Flipped to translated after reading all 31 as a French reader.

Format specifiers verified preserved on the other 30; serialization confirmed
byte-stable (json round-trip) before writing; diff is 31 value lines and
nothing else. i18n --ci passes.
@ryanbr
ryanbr force-pushed the l10n/fr-corrections-884 branch from 104acea to 06a0025 Compare July 28, 2026 04:18
@ryanbr
ryanbr merged commit 6bc869d into main Jul 28, 2026
10 checks passed
@ryanbr
ryanbr deleted the l10n/fr-corrections-884 branch July 28, 2026 04:23
ryanbr added a commit that referenced this pull request Jul 28, 2026
…884)

The Android half of the native-speaker review that landed on Apple in #919.
87 strings in values-fr rewritten; one Apple es string repaired; #920 filed for
the 209 translations blocked on extraction — which together close #884.

Terminology, matching the contributor's Apple standard: sangle (a harness
strap, 70 strings) and bande (8) become bracelet; VHR/VRH become VFC;
RECOUVREMENT becomes RÉCUPÉRATION; RHR becomes FCR; the two streaming strings
align on Transmission (including fgs_detail_streaming from #902 — my own
string, written before the standard existed).

This was hand-agreement work, not a sed, in both directions: sangle→bracelet
flips feminine to masculine ("La sangle … elle ne captera pas" → "Le bracelet
… il ne captera pas", "sangle active"→"bracelet actif", "chargée"→"chargé"),
and VHR→VFC flips masculine to feminine ("du VHR"→"de la VFC"). One legitimate
"bande" survives, deliberately: "la bande haute" is an HR zone, not a strap —
the one string the pattern matched where the old word was right.

The sweep also surfaced MT damage beyond terminology in the same 87 strings,
fixed in place rather than left half-corrected:

  "Diffusion des ressources humaines"   broadcast HUMAN RESOURCES, for HR (x2)
  "Il fait feu"                         the alarm OPENS FIRE, for "it fires"
  "briquet sur la batterie"             a CIGARETTE LIGHTER, for "lighter on battery"
  "des bûches de sangles"               FIREWOOD, for strap logs
  "Les partitions en direct"            SHEET MUSIC, for live scores
  "données bancaires"                   BANKING data, for banked data
  "Lentise le sangle de fond"           not French at all
  "piscines de sommeil profonde"        the same swimming-pools string Apple had

plus the informal tu forms ("ta sangle", "Lis") brought to the catalogue's
vous, "l'histoire"→"l'historique" (the contributor's own #919 fix, same class),
and the 5/MG deep-data toggle paragraph rewritten from word salad into French.

The Apple es Charge explainer gets its four flat errors fixed ("frecuencia
cardíaca restante" = REMAINING heart rate, "de vez en cuando" = from time to
time, "es escenario del movimiento", "corrientes crudas" = raw currents);
terminology choices there are left for a native es reader, as recorded on #884.

Verified: XML parses; zero leftovers of any swept term; format specifiers
byte-identical to the default catalogue on every changed string; no unescaped
apostrophes; i18n --ci and doc lint pass. Android CI compiles the resources.
ryanbr added a commit that referenced this pull request Jul 28, 2026
…884) (#921)

The Android half of the native-speaker review that landed on Apple in #919.
87 strings in values-fr rewritten; one Apple es string repaired; #920 filed for
the 209 translations blocked on extraction — which together close #884.

Terminology, matching the contributor's Apple standard: sangle (a harness
strap, 70 strings) and bande (8) become bracelet; VHR/VRH become VFC;
RECOUVREMENT becomes RÉCUPÉRATION; RHR becomes FCR; the two streaming strings
align on Transmission (including fgs_detail_streaming from #902 — my own
string, written before the standard existed).

This was hand-agreement work, not a sed, in both directions: sangle→bracelet
flips feminine to masculine ("La sangle … elle ne captera pas" → "Le bracelet
… il ne captera pas", "sangle active"→"bracelet actif", "chargée"→"chargé"),
and VHR→VFC flips masculine to feminine ("du VHR"→"de la VFC"). One legitimate
"bande" survives, deliberately: "la bande haute" is an HR zone, not a strap —
the one string the pattern matched where the old word was right.

The sweep also surfaced MT damage beyond terminology in the same 87 strings,
fixed in place rather than left half-corrected:

  "Diffusion des ressources humaines"   broadcast HUMAN RESOURCES, for HR (x2)
  "Il fait feu"                         the alarm OPENS FIRE, for "it fires"
  "briquet sur la batterie"             a CIGARETTE LIGHTER, for "lighter on battery"
  "des bûches de sangles"               FIREWOOD, for strap logs
  "Les partitions en direct"            SHEET MUSIC, for live scores
  "données bancaires"                   BANKING data, for banked data
  "Lentise le sangle de fond"           not French at all
  "piscines de sommeil profonde"        the same swimming-pools string Apple had

plus the informal tu forms ("ta sangle", "Lis") brought to the catalogue's
vous, "l'histoire"→"l'historique" (the contributor's own #919 fix, same class),
and the 5/MG deep-data toggle paragraph rewritten from word salad into French.

The Apple es Charge explainer gets its four flat errors fixed ("frecuencia
cardíaca restante" = REMAINING heart rate, "de vez en cuando" = from time to
time, "es escenario del movimiento", "corrientes crudas" = raw currents);
terminology choices there are left for a native es reader, as recorded on #884.

Verified: XML parses; zero leftovers of any swept term; format specifiers
byte-identical to the default catalogue on every changed string; no unescaped
apostrophes; i18n --ci and doc lint pass. Android CI compiles the resources.
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