Languages: every language of Africa #70

Open
opened 2026-09-06 20:18:31 +00:00 by tiagoagueda · 4 comments
Owner

Decision

milestone for 0.3.0 - all languages from Africa

Where this follows from

#43 set the scope: the 24 official languages of the European Union for 0.2.0, and the rest
of the world in phases afterwards. This is the first of those phases, now given a milestone
of its own rather than living inside one issue.

Shape

The languages. Arabic, Swahili, Amharic, Hausa, Yoruba, Igbo, Zulu, Xhosa, Afrikaans,
Somali, Oromo, Tigrinya, Shona, Sesotho, Setswana, Kinyarwanda, Wolof, Malagasy, Berber
(Tamazight), and the rest — French and Portuguese, already carried from 0.2.0, cover a
great deal of the continent on their own, which is worth saying because it means the gap is
smaller than the map suggests.

What a language costs, and what it does not. Every user-facing string is already
wrapped and scripts/messages.py already writes a slot in every catalogue, so a language is
a catalogue and nothing else. Machine-assisted first drafts, flagged draft until a speaker
has read them (docs/TRANSLATING.md), the same as the 24 in 0.2.0: a wrong translation
somebody can fix beats an English gap nobody notices.

Right-to-left arrives here. Arabic is the first language Postulo carries that is not
read left to right, and it is #67, which is why that now sits in this milestone too. The
layout work is done once and every later right-to-left language is then a catalogue.

What has to be checked per language, not assumed:

  1. Pluralisation. Arabic has six forms; Django knows the rules, but scripts/messages.py
    has to write the right number of slots and check has to insist they are all filled.
  2. Dates, numbers and the first day of the week, which USE_L10N supplies and which
    nobody looks at until they are wrong.
  3. The document themes. A CV is rendered in the document's language, not the interface's,
    so every built-in theme carries the section titles for every language here.
  4. Fonts. The bundled stack has to actually draw Amharic, Tigrinya and Arabic, in the
    browser and in the PDF WeasyPrint produces. A missing glyph is a box, and a box on
    somebody's CV is worse than English.

Classification

Enhancement. Not breaking: more catalogues, no code path changes.

Depends on

#67, for right-to-left, which Arabic needs.

Open question

The rest of the European continent — Ukrainian, Turkish, Norwegian, Icelandic, Serbian,
Bosnian, Albanian, Macedonian, Georgian, Armenian, Basque, Catalan, Galician, Welsh,
Luxembourgish — was phase 2 in #43 and is not named in any of the three milestones now set.
As it stands it falls into 0.5.0, behind Asia and South America. Worth deciding whether it
belongs here in 0.3.0 instead, since several are a short step from catalogues that exist.

## Decision > milestone for 0.3.0 - all languages from Africa ## Where this follows from #43 set the scope: the 24 official languages of the European Union for 0.2.0, and the rest of the world in phases afterwards. This is the first of those phases, now given a milestone of its own rather than living inside one issue. ## Shape **The languages.** Arabic, Swahili, Amharic, Hausa, Yoruba, Igbo, Zulu, Xhosa, Afrikaans, Somali, Oromo, Tigrinya, Shona, Sesotho, Setswana, Kinyarwanda, Wolof, Malagasy, Berber (Tamazight), and the rest — French and Portuguese, already carried from 0.2.0, cover a great deal of the continent on their own, which is worth saying because it means the gap is smaller than the map suggests. **What a language costs, and what it does not.** Every user-facing string is already wrapped and `scripts/messages.py` already writes a slot in every catalogue, so a language is a catalogue and nothing else. Machine-assisted first drafts, flagged `draft` until a speaker has read them (`docs/TRANSLATING.md`), the same as the 24 in 0.2.0: a wrong translation somebody can fix beats an English gap nobody notices. **Right-to-left arrives here.** Arabic is the first language Postulo carries that is not read left to right, and it is #67, which is why that now sits in this milestone too. The layout work is done once and every later right-to-left language is then a catalogue. **What has to be checked per language, not assumed:** 1. **Pluralisation.** Arabic has six forms; Django knows the rules, but `scripts/messages.py` has to write the right number of slots and `check` has to insist they are all filled. 2. **Dates, numbers and the first day of the week**, which `USE_L10N` supplies and which nobody looks at until they are wrong. 3. **The document themes.** A CV is rendered in the document's language, not the interface's, so every built-in theme carries the section titles for every language here. 4. **Fonts.** The bundled stack has to actually draw Amharic, Tigrinya and Arabic, in the browser and in the PDF WeasyPrint produces. A missing glyph is a box, and a box on somebody's CV is worse than English. ## Classification Enhancement. Not breaking: more catalogues, no code path changes. ## Depends on #67, for right-to-left, which Arabic needs. ## Open question The **rest of the European continent** — Ukrainian, Turkish, Norwegian, Icelandic, Serbian, Bosnian, Albanian, Macedonian, Georgian, Armenian, Basque, Catalan, Galician, Welsh, Luxembourgish — was phase 2 in #43 and is not named in any of the three milestones now set. As it stands it falls into 0.5.0, behind Asia and South America. Worth deciding whether it belongs here in 0.3.0 instead, since several are a short step from catalogues that exist.
tiagoagueda added this to the 0.3.0 milestone 2026-09-06 20:18:31 +00:00
Author
Owner

Infrastructure landed on 0.3.0 as e90f8de. The issue stays open for the translations.

Done

  • The twenty-nine languages, by a documented rule: official or national status in at least
    one African state, plus the cross-border lingua francas that outrank most of those in
    speakers.
  • Everything that has to be right before anybody translates against it: each language's own
    name, its gettext plural rule (Arabic six forms, Wolof/Igbo/Shona/Bamanankan one), and its
    script.
  • Right-to-left for Arabic, which #67 made work and which is now exercised end to end.
  • The flag rule held where it was written to: thirteen of the twenty-nine are deliberately
    blank because no one country is uncontestedly their home.
  • A font bug this issue would otherwise have shipped. The container installed
    fonts-dejavu-core — Latin, Greek, Cyrillic and nothing else — so an Amharic or Tigrinya
    CV rendered in it would have been a page of empty boxes. fonts-noto-core is added and
    tests/test_fonts.py holds the image's fonts to the languages actually offered.
  • A language is offered once somebody has begun its catalogue, and not before. All
    twenty-nine exist and are empty, so none is listed yet; translate one string and it
    appears with its completion percentage.
  • The suite's rule changed: "every catalogue is complete" was right for a finished phase and
    wrong for one that has just started. The EU set must stay complete; every language must
    have a correct plural rule, a direction and a page that renders; an unstarted language
    must not be offered.

Outstanding

Catalogues empty 29
Messages each 1,553
Translations outstanding 45,037
Source words to translate 263,813

That is the bulk of this issue and it is not a single sitting's work. It needs a decision
about how: machine-assisted drafts a phase at a time in the order the languages matter, a
translation platform (#43's second open question proposed Weblate once there is more than a
handful of translators), or waiting for speakers. The infrastructure is done either way, and
each language is now a catalogue and nothing else.

Infrastructure landed on `0.3.0` as e90f8de. The issue stays open for the translations. **Done** - The twenty-nine languages, by a documented rule: official or national status in at least one African state, plus the cross-border lingua francas that outrank most of those in speakers. - Everything that has to be right before anybody translates against it: each language's own name, its gettext plural rule (Arabic six forms, Wolof/Igbo/Shona/Bamanankan one), and its script. - Right-to-left for Arabic, which #67 made work and which is now exercised end to end. - The flag rule held where it was written to: thirteen of the twenty-nine are deliberately blank because no one country is uncontestedly their home. - **A font bug this issue would otherwise have shipped.** The container installed `fonts-dejavu-core` — Latin, Greek, Cyrillic and nothing else — so an Amharic or Tigrinya CV rendered in it would have been a page of empty boxes. `fonts-noto-core` is added and `tests/test_fonts.py` holds the image's fonts to the languages actually offered. - A language is offered once somebody has begun its catalogue, and not before. All twenty-nine exist and are empty, so none is listed yet; translate one string and it appears with its completion percentage. - The suite's rule changed: "every catalogue is complete" was right for a finished phase and wrong for one that has just started. The EU set must stay complete; every language must have a correct plural rule, a direction and a page that renders; an unstarted language must not be offered. **Outstanding** | | | | --- | --- | | Catalogues empty | 29 | | Messages each | 1,553 | | Translations outstanding | **45,037** | | Source words to translate | **263,813** | That is the bulk of this issue and it is not a single sitting's work. It needs a decision about how: machine-assisted drafts a phase at a time in the order the languages matter, a translation platform (#43's second open question proposed Weblate once there is more than a handful of translators), or waiting for speakers. The infrastructure is done either way, and each language is now a catalogue and nothing else.
tiagoagueda modified the milestone from 0.3.0 to 0.4.0 2026-09-08 09:32:42 +00:00
Author
Owner

Moved to 0.4.0, and the open question at the bottom of this issue is answered: the rest of Europe goes to 0.3.0 as #118, rather than falling behind Asia and South America by default.

So the order is now: the 24 EU languages (0.2.0, done) → the rest of Europe (0.3.0) → Africa (0.4.0) → Asia and South America → worldwide.

Nothing here is blocked by it. #67 is closed, so right-to-left is done and waiting rather than pending, which was this issue's only dependency.

Moved to **0.4.0**, and the open question at the bottom of this issue is answered: the rest of Europe goes to **0.3.0** as #118, rather than falling behind Asia and South America by default. So the order is now: the 24 EU languages (0.2.0, done) → the rest of Europe (0.3.0) → Africa (0.4.0) → Asia and South America → worldwide. Nothing here is blocked by it. #67 is closed, so right-to-left is done and waiting rather than pending, which was this issue's only dependency.
Author
Owner

Re-scoped by #269: this issue narrows to the Latin-script African languages, which are
blocked by nothing and stay in 0.4.0.

ar and kab leave it for Tier 3 (0.6.0), because right-to-left layout (#73, #67) has to
land before the catalogue does — ar was scheduled two milestones ahead of the work it
depends on. am and ti leave it for Tier 2 (0.5.0), because Geʽez needs the fonts (#74).

That carve-out is what lets this issue close on the languages it can actually reach, instead
of waiting on two milestones' worth of layout and font work for four of its twenty-nine.

Re-scoped by #269: **this issue narrows to the Latin-script African languages**, which are blocked by nothing and stay in 0.4.0. `ar` and `kab` leave it for Tier 3 (0.6.0), because right-to-left layout (#73, #67) has to land before the catalogue does — `ar` was scheduled two milestones ahead of the work it depends on. `am` and `ti` leave it for Tier 2 (0.5.0), because Geʽez needs the fonts (#74). That carve-out is what lets this issue close on the languages it can actually reach, instead of waiting on two milestones' worth of layout and font work for four of its twenty-nine.
tiagoagueda modified the milestone from 0.4.0 to 1.0.0 2026-09-21 18:01:27 +00:00
Author
Owner

Moved from 0.4.0 to 1.0.0: a milestone due in weeks cannot also hold twenty-five catalogues filled by hand.

Since the re-scope above this is the Latin-script set — twenty-five languages, not twenty-nine — so the figures in the first comment are high by four languages' worth. It is still tens of thousands of translations, and the comment's own conclusion stands: it needs a decision about how (machine-assisted drafts in order of priority, a translation platform, or speakers) before it needs a date.

Nothing is blocked by the delay. A language is not offered until somebody starts it — the gate is accounts/forms.py::language_choices — so the empty catalogues sit there costing nothing, and scripts/messages.py extract keeps adding each new string to all sixty-eight sets whatever milestone this is in. A language offered half-translated would be worse than one not offered yet.

Worth noting: the four carved out by #269 are still in 0.5.0 (am, ti) and 0.6.0 (ar, kab), so they now land before the Latin-script set they were carved out of. That may be right — they were carved out for layout and font reasons, not translation ones — but it is the opposite of the order the carve-out assumed, and is worth a deliberate look rather than being left as a side effect of this move.

Moved from 0.4.0 to 1.0.0: a milestone due in weeks cannot also hold twenty-five catalogues filled by hand. Since the re-scope above this is the Latin-script set — twenty-five languages, not twenty-nine — so the figures in the first comment are high by four languages' worth. It is still tens of thousands of translations, and the comment's own conclusion stands: it needs a decision about *how* (machine-assisted drafts in order of priority, a translation platform, or speakers) before it needs a date. Nothing is blocked by the delay. A language is not offered until somebody starts it — the gate is `accounts/forms.py::language_choices` — so the empty catalogues sit there costing nothing, and `scripts/messages.py extract` keeps adding each new string to all sixty-eight sets whatever milestone this is in. A language offered half-translated would be worse than one not offered yet. **Worth noting:** the four carved out by #269 are still in 0.5.0 (`am`, `ti`) and 0.6.0 (`ar`, `kab`), so they now land *before* the Latin-script set they were carved out of. That may be right — they were carved out for layout and font reasons, not translation ones — but it is the opposite of the order the carve-out assumed, and is worth a deliberate look rather than being left as a side effect of this move.
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.

Reference
Postulo/postulo#70
No description provided.