Languages: the rest of the world, and the process that makes it possible #72

Closed
opened 2026-09-06 20:18:32 +00:00 by tiagoagueda · 5 comments
Owner

Final decision on translations (maintainer, 2026-10-01) changes what this issue schedules: see the comment of that date below. Where the text here and that comment disagree, the comment holds.

Decision

milestone for 0.5.0 - all worldwide languages

Shape

Whatever is left once Europe, Africa, Asia and South America are carried: the rest of the
European continent if it has not been pulled forward (see the open question on the African
languages issue), North American and Caribbean languages beyond English, Spanish and French
— Haitian Creole, Navajo, Inuktitut, Greenlandic — and the languages of Oceania: Māori,
Samoan, Tongan, Fijian, Tok Pisin, Hawaiian.

This is where "every language" stops being a list and starts being a process. The point
of the milestone is not to enumerate the tail; it is to make adding a language something a
speaker can do without waiting for a release:

  1. A translator does not need a developer. A catalogue arrives as a pull request, or
    through whatever translation platform #43's second open question settles on, and the
    language picker offers it as soon as it is merged.
  2. The picker has to survive the size. A hundred languages is not a <select> somebody
    scrolls; it needs searching, and it has to show completion honestly so nobody is
    surprised by English in the gaps.
  3. Partial catalogues are normal, not a failure state. Most languages here will never be
    complete, and the interface should say so plainly rather than pretending.
  4. Plugins carry their own catalogues, which is already the rule, and this is the
    milestone where it stops being theoretical.

Classification

Enhancement. Not breaking.

Depends on

The earlier phases, and mostly the tooling they will have forced into existence.

> **Final decision on translations (maintainer, 2026-10-01)** changes what this issue schedules: see the comment of that date below. Where the text here and that comment disagree, the comment holds. ## Decision > milestone for 0.5.0 - all worldwide languages ## Shape Whatever is left once Europe, Africa, Asia and South America are carried: the rest of the European continent if it has not been pulled forward (see the open question on the African languages issue), North American and Caribbean languages beyond English, Spanish and French — Haitian Creole, Navajo, Inuktitut, Greenlandic — and the languages of Oceania: Māori, Samoan, Tongan, Fijian, Tok Pisin, Hawaiian. **This is where "every language" stops being a list and starts being a process.** The point of the milestone is not to enumerate the tail; it is to make adding a language something a speaker can do without waiting for a release: 1. **A translator does not need a developer.** A catalogue arrives as a pull request, or through whatever translation platform #43's second open question settles on, and the language picker offers it as soon as it is merged. 2. **The picker has to survive the size.** A hundred languages is not a `<select>` somebody scrolls; it needs searching, and it has to show completion honestly so nobody is surprised by English in the gaps. 3. **Partial catalogues are normal, not a failure state.** Most languages here will never be complete, and the interface should say so plainly rather than pretending. 4. **Plugins carry their own catalogues**, which is already the rule, and this is the milestone where it stops being theoretical. ## Classification Enhancement. Not breaking. ## Depends on The earlier phases, and mostly the tooling they will have forced into existence.
tiagoagueda added this to the 0.5.0 milestone 2026-09-06 20:18:32 +00:00
Author
Owner

Re-scoped by #269 and moved to 0.6.0.

Under speaker ordering the enumerated tail here — Oceania, the Caribbean, the North American
languages — stops being the point of this issue. Those languages are not next because of
where they are; they are late because of how many people they reach, and #269 says so
directly.

The second half is what survives, and it is the better half:

This is where "every language" stops being a list and starts being a process. The point
of the milestone is not to enumerate the tail; it is to make adding a language something a
speaker can do without waiting for a release.

Read this issue as the process issue it already half is. Weblate is running and holds the 21
components, so most of what that half asks for has somewhere to live.

Re-scoped by #269 and **moved to 0.6.0**. Under speaker ordering the enumerated tail here — Oceania, the Caribbean, the North American languages — stops being the point of this issue. Those languages are not next because of where they are; they are late because of how many people they reach, and #269 says so directly. The second half is what survives, and it is the better half: > **This is where "every language" stops being a list and starts being a process.** The point > of the milestone is not to enumerate the tail; it is to make adding a language something a > speaker can do without waiting for a release. Read this issue as the process issue it already half is. Weblate is running and holds the 21 components, so most of what that half asks for has somewhere to live.
tiagoagueda modified the milestone from 0.5.0 to 0.6.0 2026-09-17 19:44:15 +00:00
Author
Owner

Final decision on translations (maintainer, 2026-10-01)

  1. Every language is scaffolded: each has its catalogue, with a slot for every string.
  2. A development build requires every string to be present in en-GB, fr-FR and pt-PT. A draft counts.
  3. A release requires every string to be present in the languages selected for that release. A draft counts.
  4. 0.4.0 requires no additional languages.
  5. 0.5.0 additionally requires fr-CA and en-CA; then, eventually, any language of the European continent still missing (Russian excepted); and, eventually, Chinese and Arabic. Those last two may move to 0.6.0 if the load on 0.5.0 becomes too great.

What this changes here

This is the process issue, so the two rules about what is required land here.

  • Scaffolding is not offering, and neither is requiring. There are 68 catalogues today: 39 started and 29 empty (the African set). Nothing exists for Russian, Chinese, Hindi, Japanese and the rest, nor for the PALOP languages of #101. Scaffolding every language means giving each of those its catalogue and its name in core/languages.py; scripts/messages.py extract already writes a slot in every catalogue it finds. A language is still offered only once somebody starts it (accounts/forms.py::language_choices), so a scaffolded language nobody has translated stays invisible.
  • The development gate. Nothing holds fr-FR and pt-PT complete on a commit today; it is a convention. The one completeness check that runs on every commit is pt-BR's (tests/test_language_variants.py::test_every_string_came_across), which the decision does not ask of a development build. So: a per-commit test that every string is present in fr-FR and pt-PT (en-GB is the source), and pt-BR's completeness moves to the release gate.
  • The release gate. tests/test_translations.py::test_every_european_union_language_stays_complete (marked release) holds the 24 languages of the European Union, a fixed list in the test. The decision makes the list a property of the release: the gate should read the languages selected for the version being released, from one place that CONTRIBUTING.md § Making a release and scripts/release_tools.py also read.
  • Drafts count in both gates: present means translated, reviewed or not. The draft flag keeps saying which.
  • docs/TRANSLATING.md carries a table of phases by release that predates this. It should state these five points instead.
  • The plugin repositories hold the same two gates in tests/test_catalogues.py (fr-fr and pt-pt on every commit, the 24 EU languages under -m release). Their release gate follows the same change.

Nothing in the code has been changed for this; it is recorded here as the work the decision implies.

**Final decision on translations (maintainer, 2026-10-01)** 1. **Every language is scaffolded**: each has its catalogue, with a slot for every string. 2. **A development build** requires every string to be present in **en-GB, fr-FR and pt-PT**. A draft counts. 3. **A release** requires every string to be present in **the languages selected for that release**. A draft counts. 4. **0.4.0** requires no additional languages. 5. **0.5.0** additionally requires **fr-CA** and **en-CA**; then, eventually, any language of the European continent still missing (Russian excepted); and, eventually, **Chinese** and **Arabic**. Those last two may move to 0.6.0 if the load on 0.5.0 becomes too great. ## What this changes here This is the process issue, so the two rules about what is *required* land here. - **Scaffolding is not offering, and neither is requiring.** There are 68 catalogues today: 39 started and 29 empty (the African set). Nothing exists for Russian, Chinese, Hindi, Japanese and the rest, nor for the PALOP languages of #101. Scaffolding every language means giving each of those its catalogue and its name in `core/languages.py`; `scripts/messages.py extract` already writes a slot in every catalogue it finds. A language is still offered only once somebody starts it (`accounts/forms.py::language_choices`), so a scaffolded language nobody has translated stays invisible. - **The development gate.** Nothing holds fr-FR and pt-PT complete on a commit today; it is a convention. The one completeness check that runs on every commit is pt-BR's (`tests/test_language_variants.py::test_every_string_came_across`), which the decision does not ask of a development build. So: a per-commit test that every string is present in fr-FR and pt-PT (en-GB is the source), and pt-BR's completeness moves to the release gate. - **The release gate.** `tests/test_translations.py::test_every_european_union_language_stays_complete` (marked `release`) holds the 24 languages of the European Union, a fixed list in the test. The decision makes the list a property of the release: the gate should read the languages selected for the version being released, from one place that `CONTRIBUTING.md` § *Making a release* and `scripts/release_tools.py` also read. - **Drafts count** in both gates: present means translated, reviewed or not. The `draft` flag keeps saying which. - **`docs/TRANSLATING.md`** carries a table of phases by release that predates this. It should state these five points instead. - **The plugin repositories** hold the same two gates in `tests/test_catalogues.py` (fr-fr and pt-pt on every commit, the 24 EU languages under `-m release`). Their release gate follows the same change. Nothing in the code has been changed for this; it is recorded here as the work the decision implies.
Author
Owner

Follow-up to the final decision on translations (maintainer, 2026-10-01)

  • Chinese: both. Simplified and traditional, two catalogues (zh-Hans, zh-Hant).
  • "European" means the continent, not the European Union. Turkish and Icelandic count; they are already carried.
  • Every component moves with the core, language-wise, plugins and extensions included.

The work is postulo/postulo#347.

The gate changes listed in the comment above are now postulo/postulo#347; the plugin repositories each have an issue named there.

**Follow-up to the final decision on translations (maintainer, 2026-10-01)** - **Chinese: both.** Simplified and traditional, two catalogues (`zh-Hans`, `zh-Hant`). - **"European" means the continent, not the European Union.** Turkish and Icelandic count; they are already carried. - **Every component moves with the core, language-wise**, plugins and extensions included. The work is postulo/postulo#347. The gate changes listed in the comment above are now postulo/postulo#347; the plugin repositories each have an issue named there.
Author
Owner

Europe's missing languages, decided (maintainer, 2026-10-01)

Europe's regional and minority languages (#348) are required by 1.0.0 unless a contributed translation arrives sooner, in which case the language is selected for the release it arrives in. That "unless" is this issue's subject: a speaker being able to add a language without waiting for a developer is what lets one of them arrive early.

**Europe's missing languages, decided (maintainer, 2026-10-01)** Europe's regional and minority languages (#348) are required by 1.0.0 **unless a contributed translation arrives sooner**, in which case the language is selected for the release it arrives in. That "unless" is this issue's subject: a speaker being able to add a language without waiting for a developer is what lets one of them arrive early.
Author
Owner

Landed on main with a green Forgejo CI run. Its entry in the CHANGELOG's Unreleased section ends in (#72).

Landed on main with a green Forgejo CI run. Its entry in the CHANGELOG's Unreleased section ends in (#72).
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.

Depends on
Reference
Postulo/postulo#72
No description provided.