Weak machine translations: fix the drafts Weblate's automatic translation leaves, and stop new ones #910

Open
opened 2026-10-15 16:56:02 +00:00 by tiagoagueda · 1 comment
Owner

Many catalogues hold weak machine drafts. Fix them in Weblate, and stop new ones from piling up.

Where they come from

Every Weblate component runs the Automatic translation add-on: LibreTranslate, query state:empty, mode fuzzy, threshold 80. Each new source string gets a LibreTranslate draft in every language. Many of those drafts are poor:

  • placeholders translated, dropped or broken (%(compte)s, {compte}, SECRET KEY);
  • literal or plainly wrong meanings ("Trigo de pão" for Breadcrumb, «Prométhée» for Prometheus, «Ce vaisseau» for This ships inside Postulo);
  • the wrong variety or register (Brazilian forms in pt-PT, «tu» in French);
  • repetition loops in zh-Hant (相關相關相關…);
  • leftover markup such as [X] and [hariri chanzo].

Drafts count for the release gate (#347), so none of this blocks a build, but users see it.

How big it is (2026-10-15, after #893 merged)

Left out of the compiled catalogues. messages.py check excludes these drafts from the .mo files, so users see English for them:

  • 1,684 in total: 1,151 whose placeholders differ from the source, and 533 that drop a count other numbers need.
  • By language:
Language Excluded drafts
sw 528
ur 322
ar 140
sq 129
eu 100
ca 71
tr 60
zh-Hant 50
sk 40
ro 31
bg 26
zh-Hans 24
ga 23
cs 17
nb 16
fi 14
el 14
others under 10 each

Compiled but poor. A sample audit (150 strings per language, 2026-10-13) found these shares of drafts wrong in meaning:

  • 11%: ca, lv
  • 7%: et, eu
  • 5%: bg, de, it
  • 4%: da
  • 3%: cy, es

Never reviewed at all:

  • zh-Hans: all 4,734 strings are machine drafts.
  • zh-Hant: about 3,650 machine drafts. Its empty strings and 289 broken repetition loops were already rewritten.
  • sr-Cyrl: 2,113 older machine drafts.
  • The other 0.4.0 languages: everything except about 140 strings each.

Already done, outside this issue:

  • Reviewed and corrected: pt-PT, fr-FR, fr-CA, es-MX, gl, id, hu and lt, plus the 2026-10-13/15 fill.
  • Rewritten from scratch as drafts: bn, ar and hi.
  • Written as hand drafts, needing native review: the seven new languages (az, be, kk, cnr, nn, rm, fo).

What to do

  1. Stop the inflow. Pick one:

    • turn the add-on off;
    • raise its threshold so it only copies translation memory;
    • keep LibreTranslate for languages with no translator, but add a check so a draft that changes placeholders is never saved.

    Today a draft that breaks a placeholder is saved as needing editing, and nothing flags it.

  2. Fix the excluded drafts first. Do every language in the table: restore the placeholder set and the count, or rewrite the string. These are what put English on screen.

  3. Review the 0.5.0 languages, worst first. Order by the audit: ca, lv, et, eu, then the rest. Use the same glossary-first method as the 2026-10-13 passes: a binding term sheet per language, then batches that check against it. Keep each result as needing review until a native speaker approves it.

  4. zh-Hans and zh-Hant. Retranslate from the zh-Hant glossary (Taiwan usage) and a new zh-Hans one. Patching these drafts isn't enough: they mix scripts and get core terms wrong (應用程式 for a job application, 上市 for a listing).

  5. Add a guard. A check (messages.py check, or a Weblate quality check) that reports per language how many drafts are excluded, so the number can only go down.

Not part of this issue

These are filed or tracked elsewhere:

  • Shared source strings that need a context. "Apply" means both applying a filter and applying for a job; "From", "Other" and "Sent" are also shared. Translators can't fix these, so they need a separate core issue for pgettext.
  • The "Industry" retranslation in fr, pt and es after #897. Left to the maintainer.
Many catalogues hold weak machine drafts. Fix them in Weblate, and stop new ones from piling up. ## Where they come from Every Weblate component runs the **Automatic translation** add-on: LibreTranslate, query `state:empty`, mode *fuzzy*, threshold 80. Each new source string gets a LibreTranslate draft in every language. Many of those drafts are poor: - placeholders translated, dropped or broken (`%(compte)s`, `{compte}`, `SECRET KEY`); - literal or plainly wrong meanings ("Trigo de pão" for *Breadcrumb*, «Prométhée» for *Prometheus*, «Ce vaisseau» for *This ships inside Postulo*); - the wrong variety or register (Brazilian forms in pt-PT, «tu» in French); - repetition loops in zh-Hant (相關相關相關…); - leftover markup such as `[X]` and `[hariri chanzo]`. Drafts count for the release gate (#347), so none of this blocks a build, but users see it. ## How big it is (2026-10-15, after #893 merged) **Left out of the compiled catalogues.** `messages.py check` excludes these drafts from the `.mo` files, so users see English for them: - 1,684 in total: 1,151 whose placeholders differ from the source, and 533 that drop a count other numbers need. - By language: | Language | Excluded drafts | |---|---| | sw | 528 | | ur | 322 | | ar | 140 | | sq | 129 | | eu | 100 | | ca | 71 | | tr | 60 | | zh-Hant | 50 | | sk | 40 | | ro | 31 | | bg | 26 | | zh-Hans | 24 | | ga | 23 | | cs | 17 | | nb | 16 | | fi | 14 | | el | 14 | | others | under 10 each | **Compiled but poor.** A sample audit (150 strings per language, 2026-10-13) found these shares of drafts wrong in meaning: - 11%: ca, lv - 7%: et, eu - 5%: bg, de, it - 4%: da - 3%: cy, es **Never reviewed at all:** - zh-Hans: all 4,734 strings are machine drafts. - zh-Hant: about 3,650 machine drafts. Its empty strings and 289 broken repetition loops were already rewritten. - sr-Cyrl: 2,113 older machine drafts. - The other 0.4.0 languages: everything except about 140 strings each. **Already done, outside this issue:** - Reviewed and corrected: pt-PT, fr-FR, fr-CA, es-MX, gl, id, hu and lt, plus the 2026-10-13/15 fill. - Rewritten from scratch as drafts: bn, ar and hi. - Written as hand drafts, needing native review: the seven new languages (az, be, kk, cnr, nn, rm, fo). ## What to do 1. **Stop the inflow.** Pick one: - turn the add-on off; - raise its threshold so it only copies translation memory; - keep LibreTranslate for languages with no translator, but add a check so a draft that changes placeholders is never saved. Today a draft that breaks a placeholder is saved as needing editing, and nothing flags it. 2. **Fix the excluded drafts first.** Do every language in the table: restore the placeholder set and the count, or rewrite the string. These are what put English on screen. 3. **Review the 0.5.0 languages, worst first.** Order by the audit: ca, lv, et, eu, then the rest. Use the same glossary-first method as the 2026-10-13 passes: a binding term sheet per language, then batches that check against it. Keep each result as needing review until a native speaker approves it. 4. **zh-Hans and zh-Hant.** Retranslate from the zh-Hant glossary (Taiwan usage) and a new zh-Hans one. Patching these drafts isn't enough: they mix scripts and get core terms wrong (應用程式 for a job application, 上市 for a listing). 5. **Add a guard.** A check (`messages.py check`, or a Weblate quality check) that reports per language how many drafts are excluded, so the number can only go down. ## Not part of this issue These are filed or tracked elsewhere: - **Shared source strings that need a context.** "Apply" means both applying a filter and applying for a job; "From", "Other" and "Sent" are also shared. Translators can't fix these, so they need a separate core issue for `pgettext`. - **The "Industry" retranslation in fr, pt and es after #897.** Left to the maintainer.
tiagoagueda added this to the 0.5.0 milestone 2026-10-25 17:04:12 +00:00
tiagoagueda modified the milestone from 0.5.0 to 0.6.0 2026-10-31 15:55:19 +00:00
Author
Owner

Moved to 0.6.0 at the maintainer's word (2026-10-31), to release 0.5.0 today. The remaining machine drafts are Weblate review work; the 0.5.0 release gate counts drafts, so they do not block it.

Moved to 0.6.0 at the maintainer's word (2026-10-31), to release 0.5.0 today. The remaining machine drafts are Weblate review work; the 0.5.0 release gate counts drafts, so they do not block it.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Postulo/postulo#910
No description provided.