All PALOP national languages — and an honest account of what a machine can translate #101

Open
opened 2026-09-07 15:31:23 +00:00 by tiagoagueda · 1 comment
Owner

Observation

still on the 0.3.0 target, i want all language from PALOP language the available, even if
with LLM help

What "all languages from PALOP" has to mean

The PALOP states are Angola, Cabo Verde, Guinea-Bissau, Mozambique and Sao Tome and
Principe. The official language of all five is Portuguese, and Postulo has spoken that
since 0.2.0 -- so read literally the request is already done, which is plainly not what is
being asked.

What is being asked for is the national and vernacular languages of those five countries:
the creoles and the Bantu languages people actually speak at home, none of which any
job-search tool ever offers.

Five of them are already there

#70 added twenty-nine African languages to the 0.3.0 branch, and five happen to be PALOP
national languages: ff Pulaar (Guinea-Bissau), ts Xitsonga (Mozambique), ny Chichewa
(Mozambique), sn chiShona (Mozambique), sw Kiswahili (northern Mozambique).

What is missing

Country Language ISO 639-3 Flag
Angola Umbundu umb AO
Angola Kimbundu kmb AO
Angola Kikongo kon none -- Angola, DR Congo and Congo
Angola Cokwe cjk none -- Angola, DR Congo, Zambia
Angola Mbunda / Ngangela mck AO
Angola Oshikwanyama kua none -- Angola and Namibia
Cabo Verde Kabuverdianu kea CV
Guinea-Bissau Kriol pov GW
Guinea-Bissau Mandinka mnk none -- five countries
Guinea-Bissau Balanta ble GW
Mozambique Emakhuwa vmw MZ
Mozambique Cisena seh none -- Mozambique and Malawi
Mozambique Elomwe ngl MZ
Mozambique Echuwabo chw MZ
Mozambique Shimakonde kde MZ
Mozambique Xirhonga rng MZ
Mozambique Citshwa tsc MZ
Mozambique Cicopi cce MZ
Sao Tome Forro / Santome cri ST
Sao Tome Angolar aoa ST
Sao Tome Principense / Lung'Ie pre ST

Twenty-one, which is scopeable. The flag column applies the rule languages.py already
states -- "a language with no uncontested home gets no flag at all. No flag beats a wrong
flag"
-- and it lands well here: most of these belong to exactly one country, which is
unusual and convenient.

One scope question. Equatorial Guinea has Portuguese as an official language and joined
the CPLP in 2014, but is not conventionally PALOP. Including it adds Fang, Bube and
Annobonese. Say which.

The part that needs saying plainly: an LLM cannot do most of this

The project already permits machine-assisted translation -- docs/TRANSLATING.md gives every
unreviewed string a draft flag until a speaker sees it -- so this is not a policy change.
It is a question of what a machine will actually produce, and the answer differs enormously
across that table:

  • Kabuverdianu, Kriol, Kikongo have a real digital corpus and appear in general
    translation systems. A draft is worth having.
  • Umbundu, Kimbundu, Cokwe, Mbunda, Emakhuwa, Sena, Lomwe, Chuwabo, Makonde, Rhonga,
    Tshwa, Copi
    have very little written text online. A model asked for these will not say
    it does not know: it will return Portuguese with altered morphology, or invented
    words
    , fluently and confidently.
  • Angolar has a few thousand speakers and Principense a few hundred, both
    critically endangered, with almost nothing written. There is no honest machine output for
    these at all.

This matters more here than in most software. A wrong label on Delete account or Withdraw
application
in a tool holding somebody's job search is not a cosmetic bug, and a fluent
wrong translation is harder to spot than an obvious one. languages.py already reasons this
way about flags; the same principle applies to words.

The proposal, which gets the request without the harm

  1. Add all twenty-one to the picker. This part is cheap, correct, and most of the point:
    somebody finding Umbundu in a list is being told this software considers their language
    real. #70 has already established that a language may be offered with an empty catalogue.

  2. Fill only what a machine can honestly do, every string flagged draft, and record per
    language which of the three tiers above it fell into -- so a reviewer knows whether they
    are checking a draft or writing the first version.

  3. Fall back to Portuguese, not English. This is the most valuable part and it is not
    currently possible. An untranslated string falls back to en-gb, the source language. But
    every one of these languages is spoken in a country whose official language is
    Portuguese
    , which Postulo already speaks fully. A Cape Verdean seeing Portuguese where
    Kabuverdianu is missing is far better served than one seeing English. A per-language
    fallback chain would make a half-filled catalogue genuinely usable instead of a patchwork
    of two languages neither of which is the one asked for.

    Django does not do arbitrary fallback chains -- get_supported_language_variant only
    walks to the generic form -- so this is real work, and it is the piece worth building even
    if the catalogues stay empty for years.

  4. Plural rules need care. Every language needs a PLURAL_FORMS entry, and a wrong one
    makes every count in the interface ungrammatical. Most Bantu languages take
    nplurals=2; plural=(n != 1); and the creoles likewise, but this should come from CLDR
    where CLDR has it rather than from a guess, and be marked as unverified where it does not.

Scope

  • Twenty-one entries in NATIVE_NAMES, FLAG_COUNTRIES and PLURAL_FORMS, on the 0.3.0
    branch where #70's work lives.
  • Catalogues generated for all, filled where honest, every entry draft.
  • A fallback chain so a missing string resolves to Portuguese rather than English.
  • The translation status page says which tier each language is in, so nobody mistakes a
    machine draft for a reviewed translation.

Classification

Enhancement, internationalisation. Depends on #70 for the machinery and shares its branch.

## Observation > still on the 0.3.0 target, i want all language from PALOP language the available, even if > with LLM help ## What "all languages from PALOP" has to mean The PALOP states are Angola, Cabo Verde, Guinea-Bissau, Mozambique and Sao Tome and Principe. **The official language of all five is Portuguese**, and Postulo has spoken that since 0.2.0 -- so read literally the request is already done, which is plainly not what is being asked. What is being asked for is the **national and vernacular languages** of those five countries: the creoles and the Bantu languages people actually speak at home, none of which any job-search tool ever offers. ## Five of them are already there #70 added twenty-nine African languages to the `0.3.0` branch, and five happen to be PALOP national languages: `ff` Pulaar (Guinea-Bissau), `ts` Xitsonga (Mozambique), `ny` Chichewa (Mozambique), `sn` chiShona (Mozambique), `sw` Kiswahili (northern Mozambique). ## What is missing | Country | Language | ISO 639-3 | Flag | | --- | --- | --- | --- | | Angola | Umbundu | `umb` | AO | | Angola | Kimbundu | `kmb` | AO | | Angola | Kikongo | `kon` | **none** -- Angola, DR Congo and Congo | | Angola | Cokwe | `cjk` | **none** -- Angola, DR Congo, Zambia | | Angola | Mbunda / Ngangela | `mck` | AO | | Angola | Oshikwanyama | `kua` | **none** -- Angola and Namibia | | Cabo Verde | Kabuverdianu | `kea` | CV | | Guinea-Bissau | Kriol | `pov` | GW | | Guinea-Bissau | Mandinka | `mnk` | **none** -- five countries | | Guinea-Bissau | Balanta | `ble` | GW | | Mozambique | Emakhuwa | `vmw` | MZ | | Mozambique | Cisena | `seh` | **none** -- Mozambique and Malawi | | Mozambique | Elomwe | `ngl` | MZ | | Mozambique | Echuwabo | `chw` | MZ | | Mozambique | Shimakonde | `kde` | MZ | | Mozambique | Xirhonga | `rng` | MZ | | Mozambique | Citshwa | `tsc` | MZ | | Mozambique | Cicopi | `cce` | MZ | | Sao Tome | Forro / Santome | `cri` | ST | | Sao Tome | Angolar | `aoa` | ST | | Sao Tome | Principense / Lung'Ie | `pre` | ST | Twenty-one, which is scopeable. The flag column applies the rule `languages.py` already states -- *"a language with no uncontested home gets no flag at all. No flag beats a wrong flag"* -- and it lands well here: most of these belong to exactly one country, which is unusual and convenient. **One scope question.** Equatorial Guinea has Portuguese as an official language and joined the CPLP in 2014, but is not conventionally PALOP. Including it adds Fang, Bube and Annobonese. Say which. ## The part that needs saying plainly: an LLM cannot do most of this The project already permits machine-assisted translation -- `docs/TRANSLATING.md` gives every unreviewed string a `draft` flag until a speaker sees it -- so this is not a policy change. It is a question of what a machine will actually produce, and the answer differs enormously across that table: - **Kabuverdianu, Kriol, Kikongo** have a real digital corpus and appear in general translation systems. A draft is worth having. - **Umbundu, Kimbundu, Cokwe, Mbunda, Emakhuwa, Sena, Lomwe, Chuwabo, Makonde, Rhonga, Tshwa, Copi** have very little written text online. A model asked for these will not say it does not know: it will return **Portuguese with altered morphology, or invented words**, fluently and confidently. - **Angolar** has a few thousand speakers and **Principense** a few hundred, both critically endangered, with almost nothing written. There is no honest machine output for these at all. This matters more here than in most software. A wrong label on *Delete account* or *Withdraw application* in a tool holding somebody's job search is not a cosmetic bug, and a fluent wrong translation is harder to spot than an obvious one. `languages.py` already reasons this way about flags; the same principle applies to words. ## The proposal, which gets the request without the harm 1. **Add all twenty-one to the picker.** This part is cheap, correct, and most of the point: somebody finding Umbundu in a list is being told this software considers their language real. #70 has already established that a language may be offered with an empty catalogue. 2. **Fill only what a machine can honestly do**, every string flagged `draft`, and record per language which of the three tiers above it fell into -- so a reviewer knows whether they are checking a draft or writing the first version. 3. **Fall back to Portuguese, not English.** This is the most valuable part and it is not currently possible. An untranslated string falls back to `en-gb`, the source language. But **every one of these languages is spoken in a country whose official language is Portuguese**, which Postulo already speaks fully. A Cape Verdean seeing Portuguese where Kabuverdianu is missing is far better served than one seeing English. A per-language fallback chain would make a half-filled catalogue genuinely usable instead of a patchwork of two languages neither of which is the one asked for. Django does not do arbitrary fallback chains -- `get_supported_language_variant` only walks to the generic form -- so this is real work, and it is the piece worth building even if the catalogues stay empty for years. 4. **Plural rules need care.** Every language needs a `PLURAL_FORMS` entry, and a wrong one makes every count in the interface ungrammatical. Most Bantu languages take `nplurals=2; plural=(n != 1);` and the creoles likewise, but this should come from CLDR where CLDR has it rather than from a guess, and be marked as unverified where it does not. ## Scope - Twenty-one entries in `NATIVE_NAMES`, `FLAG_COUNTRIES` and `PLURAL_FORMS`, on the `0.3.0` branch where #70's work lives. - Catalogues generated for all, filled where honest, every entry `draft`. - A fallback chain so a missing string resolves to Portuguese rather than English. - The translation status page says which tier each language is in, so nobody mistakes a machine draft for a reviewed translation. ## Classification Enhancement, internationalisation. Depends on #70 for the machinery and shares its branch.
tiagoagueda added this to the 0.3.0 milestone 2026-09-07 15:31:23 +00:00
tiagoagueda modified the milestone from 0.3.0 to 1.0.0 2026-09-07 17:59:50 +00:00
Author
Owner

Moved to 1.0.0. The scale is the reason: twenty-one national languages, most with little or no digital corpus, and three of them — Angolar, Principense, and arguably Cokwe — with no honest machine output at all. That is a long piece of work with real speakers in the loop, and pinning it to 0.3.0 would either delay that release or produce catalogues nobody has read.

The fallback work should not wait for it. The most valuable part of this issue is that an untranslated string in a PALOP language should fall back to Portuguese rather than English — every one of those countries has Portuguese as an official language, and Postulo speaks it fully. That is worth building even while the catalogues stay empty, and it is what makes a half-filled catalogue usable instead of a patchwork of two languages neither of which was asked for.

Brazilian Portuguese is filed separately for 0.3.0: it is a different kind of job entirely — a variant of a language Postulo already speaks completely.

Moved to **1.0.0**. The scale is the reason: twenty-one national languages, most with little or no digital corpus, and three of them — Angolar, Principense, and arguably Cokwe — with no honest machine output at all. That is a long piece of work with real speakers in the loop, and pinning it to 0.3.0 would either delay that release or produce catalogues nobody has read. **The fallback work should not wait for it.** The most valuable part of this issue is that an untranslated string in a PALOP language should fall back to Portuguese rather than English — every one of those countries has Portuguese as an official language, and Postulo speaks it fully. That is worth building even while the catalogues stay empty, and it is what makes a half-filled catalogue usable instead of a patchwork of two languages neither of which was asked for. Brazilian Portuguese is filed separately for 0.3.0: it is a different kind of job entirely — a variant of a language Postulo already speaks completely.
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#101
No description provided.