i18n(client): fill a plural branch Crowdin omitted instead of dropping the message

Complete a plural category the target locale needs from the message's own
`other` branch during sync, so one missing branch no longer costs the whole
translation. Romanian arrived with `one` and `other` for all 156 of its
plurals and rendered English for every one of them. See docs/LOCALIZATION.md.
This commit is contained in:
neon
2026-08-27 18:54:17 +00:00
parent 07de9cf908
commit 90bb087180
6 changed files with 127 additions and 33 deletions
+4 -1
View File
@@ -113,7 +113,10 @@ The retention check compares presence, never message content. Exports request on
The check guards against a truncated or empty export, not against churn. Single translations leave Crowdin constantly: a reviewer unapproves a string, or an English edit invalidates the translation attached to it. A locale may lose up to twenty-five keys, or one percent of its translated keys where that is larger, before the run fails. Losses below that limit are listed in the pull request body and the English source renders for them. Failing on each one blocked every other locale over a single message and needed a hand-typed acknowledgement that a scheduled run cannot supply, which is why the export stalled repeatedly.
A message this workflow omits, because it carries HTML or breaks its ICU contract, is reported as a rejection rather than counted as a loss. Punctuation the catalogs prohibit is rewritten rather than rejected: a Unicode em dash returned by Crowdin becomes the hyphen the English source uses, so the translation survives and the catalogs stay free of the character. Fix the em dash in Crowdin when a translator's wording depends on it.
A message this workflow omits, because it carries HTML or breaks its ICU contract, is reported as a rejection rather than counted as a loss. Two mechanical defects are repaired instead of rejected, and both disappear on their own once Crowdin carries a clean message:
- A Unicode em dash becomes the hyphen the English source uses, so the translation survives and the catalogs stay free of the character.
- A plural branch the target locale needs and Crowdin omitted is filled from the message's own `other` branch. A translator types the whole ICU message by hand, so a locale with more categories than English loses every plural to one missing branch: Romanian arrived with `one` and `other` for all 156 of its plurals and rendered English for every one of them. The filled branch reads in the translator's language rather than English, and it is still worth fixing properly in Crowdin, because a copied branch cannot carry the form the category actually needs.
A manual workflow dispatch may pass exact `locale:message.key` values in `allowed_translation_losses`, separated by commas, to exclude known removals from the limit. Unknown, misspelled, and duplicate acknowledgements fail the run, so this input cannot act as a broad bypass.