@kolanut/language-packs 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +132 -40
  3. package/package.json +1 -2
  4. package/packs/afrikaans/keywords.json +39 -0
  5. package/packs/afrikaans/pack.json +40 -1
  6. package/packs/amharic/keywords.json +39 -0
  7. package/packs/amharic/pack.json +40 -1
  8. package/packs/arabic/keywords.json +39 -0
  9. package/packs/arabic/pack.json +40 -1
  10. package/packs/bambara/keywords.json +39 -0
  11. package/packs/bambara/pack.json +40 -1
  12. package/packs/by-country.json +1 -1
  13. package/packs/by-region.json +1 -1
  14. package/packs/coverage-summary.json +12 -12
  15. package/packs/french/keywords.json +39 -0
  16. package/packs/french/pack.json +40 -1
  17. package/packs/fulfulde/keywords.json +39 -0
  18. package/packs/fulfulde/pack.json +40 -1
  19. package/packs/hausa/keywords.json +39 -0
  20. package/packs/hausa/pack.json +40 -1
  21. package/packs/igbo/keywords.json +39 -0
  22. package/packs/igbo/pack.json +40 -1
  23. package/packs/index.json +25 -25
  24. package/packs/kinyarwanda/keywords.json +39 -0
  25. package/packs/kinyarwanda/pack.json +40 -1
  26. package/packs/languages-roadmap.json +151 -4
  27. package/packs/lingala/keywords.json +39 -0
  28. package/packs/lingala/pack.json +40 -1
  29. package/packs/logical-tokens.json +22 -8
  30. package/packs/luganda/keywords.json +39 -0
  31. package/packs/luganda/pack.json +40 -1
  32. package/packs/nigerian-pidgin/keywords.json +39 -0
  33. package/packs/nigerian-pidgin/pack.json +40 -1
  34. package/packs/official-target-keywords.json +16 -3
  35. package/packs/oromo/keywords.json +39 -0
  36. package/packs/oromo/pack.json +40 -1
  37. package/packs/portuguese-africa/keywords.json +39 -0
  38. package/packs/portuguese-africa/pack.json +40 -1
  39. package/packs/sesotho/keywords.json +39 -0
  40. package/packs/sesotho/pack.json +40 -1
  41. package/packs/setswana/keywords.json +39 -0
  42. package/packs/setswana/pack.json +40 -1
  43. package/packs/shona/keywords.json +39 -0
  44. package/packs/shona/pack.json +40 -1
  45. package/packs/somali/keywords.json +39 -0
  46. package/packs/somali/pack.json +40 -1
  47. package/packs/swahili/keywords.json +39 -0
  48. package/packs/swahili/pack.json +40 -1
  49. package/packs/target-coverage.json +90 -13
  50. package/packs/tigrinya/keywords.json +39 -0
  51. package/packs/tigrinya/pack.json +40 -1
  52. package/packs/twi/keywords.json +39 -0
  53. package/packs/twi/pack.json +40 -1
  54. package/packs/wolof/keywords.json +39 -0
  55. package/packs/wolof/pack.json +40 -1
  56. package/packs/xhosa/keywords.json +39 -0
  57. package/packs/xhosa/pack.json +40 -1
  58. package/packs/yoruba/keywords.json +39 -0
  59. package/packs/yoruba/pack.json +40 -1
  60. package/packs/zulu/keywords.json +39 -0
  61. package/packs/zulu/pack.json +40 -1
  62. package/badges/coverage.json +0 -6
  63. package/badges/packs.json +0 -6
  64. package/badges/targets.json +0 -6
  65. package/badges/tokens.json +0 -6
package/CONTRIBUTING.md CHANGED
@@ -51,7 +51,7 @@ You can browse packs in `packs/index.json`, filter by country in `packs/by-count
51
51
 
52
52
  ### The token registry: What you need to translate
53
53
 
54
- **Every pack must translate all logical tokens in `packs/logical-tokens.json`** (currently **99 tokens** across core, standard, and advanced tiers).
54
+ **Every pack must translate all logical tokens in `packs/logical-tokens.json`** (currently **112 tokens** across core, standard, advanced, and typescript-types tiers).
55
55
 
56
56
  **Important rules:**
57
57
  - Don't create custom token keys — propose new tokens in a separate PR
package/README.md CHANGED
@@ -2,10 +2,71 @@
2
2
 
3
3
  **Public open-source package** · Apache 2.0 · [Kolanut Technologies Ltd](https://kolacode.africa)
4
4
 
5
+ [![npm](https://img.shields.io/npm/v/%40kolanut%2Flanguage-packs)](https://www.npmjs.com/package/@kolanut/language-packs)
6
+
5
7
  Language packs for African-language programming: a consistent set of **logical programming concepts**, mapped to **native-language phrases**, with enough structure for tools to transpile to **JavaScript, Python, TypeScript, Go, and Rust**.
6
8
 
7
9
  If you’re building an editor, a transpiler, a linter, or a learning tool, this repo is the shared “source of truth”.
8
10
 
11
+ Africa-first:
12
+
13
+ <p>
14
+ <img alt="Algeria" src="https://flagcdn.com/16x12/dz.png" width="16" height="12" />
15
+ <img alt="Angola" src="https://flagcdn.com/16x12/ao.png" width="16" height="12" />
16
+ <img alt="Benin" src="https://flagcdn.com/16x12/bj.png" width="16" height="12" />
17
+ <img alt="Botswana" src="https://flagcdn.com/16x12/bw.png" width="16" height="12" />
18
+ <img alt="Burkina Faso" src="https://flagcdn.com/16x12/bf.png" width="16" height="12" />
19
+ <img alt="Burundi" src="https://flagcdn.com/16x12/bi.png" width="16" height="12" />
20
+ <img alt="Cabo Verde" src="https://flagcdn.com/16x12/cv.png" width="16" height="12" />
21
+ <img alt="Cameroon" src="https://flagcdn.com/16x12/cm.png" width="16" height="12" />
22
+ <img alt="Central African Republic" src="https://flagcdn.com/16x12/cf.png" width="16" height="12" />
23
+ <img alt="Chad" src="https://flagcdn.com/16x12/td.png" width="16" height="12" />
24
+ <img alt="Comoros" src="https://flagcdn.com/16x12/km.png" width="16" height="12" />
25
+ <img alt="Congo (Republic)" src="https://flagcdn.com/16x12/cg.png" width="16" height="12" />
26
+ <img alt="Congo (DRC)" src="https://flagcdn.com/16x12/cd.png" width="16" height="12" />
27
+ <img alt="Djibouti" src="https://flagcdn.com/16x12/dj.png" width="16" height="12" />
28
+ <img alt="Egypt" src="https://flagcdn.com/16x12/eg.png" width="16" height="12" />
29
+ <img alt="Equatorial Guinea" src="https://flagcdn.com/16x12/gq.png" width="16" height="12" />
30
+ <img alt="Eritrea" src="https://flagcdn.com/16x12/er.png" width="16" height="12" />
31
+ <img alt="Eswatini" src="https://flagcdn.com/16x12/sz.png" width="16" height="12" />
32
+ <img alt="Ethiopia" src="https://flagcdn.com/16x12/et.png" width="16" height="12" />
33
+ <img alt="Gabon" src="https://flagcdn.com/16x12/ga.png" width="16" height="12" />
34
+ <img alt="Gambia" src="https://flagcdn.com/16x12/gm.png" width="16" height="12" />
35
+ <img alt="Ghana" src="https://flagcdn.com/16x12/gh.png" width="16" height="12" />
36
+ <img alt="Guinea" src="https://flagcdn.com/16x12/gn.png" width="16" height="12" />
37
+ <img alt="Guinea-Bissau" src="https://flagcdn.com/16x12/gw.png" width="16" height="12" />
38
+ <img alt="Ivory Coast" src="https://flagcdn.com/16x12/ci.png" width="16" height="12" />
39
+ <img alt="Kenya" src="https://flagcdn.com/16x12/ke.png" width="16" height="12" />
40
+ <img alt="Lesotho" src="https://flagcdn.com/16x12/ls.png" width="16" height="12" />
41
+ <img alt="Liberia" src="https://flagcdn.com/16x12/lr.png" width="16" height="12" />
42
+ <img alt="Libya" src="https://flagcdn.com/16x12/ly.png" width="16" height="12" />
43
+ <img alt="Madagascar" src="https://flagcdn.com/16x12/mg.png" width="16" height="12" />
44
+ <img alt="Malawi" src="https://flagcdn.com/16x12/mw.png" width="16" height="12" />
45
+ <img alt="Mali" src="https://flagcdn.com/16x12/ml.png" width="16" height="12" />
46
+ <img alt="Mauritania" src="https://flagcdn.com/16x12/mr.png" width="16" height="12" />
47
+ <img alt="Mauritius" src="https://flagcdn.com/16x12/mu.png" width="16" height="12" />
48
+ <img alt="Morocco" src="https://flagcdn.com/16x12/ma.png" width="16" height="12" />
49
+ <img alt="Mozambique" src="https://flagcdn.com/16x12/mz.png" width="16" height="12" />
50
+ <img alt="Namibia" src="https://flagcdn.com/16x12/na.png" width="16" height="12" />
51
+ <img alt="Niger" src="https://flagcdn.com/16x12/ne.png" width="16" height="12" />
52
+ <img alt="Nigeria" src="https://flagcdn.com/16x12/ng.png" width="16" height="12" />
53
+ <img alt="Rwanda" src="https://flagcdn.com/16x12/rw.png" width="16" height="12" />
54
+ <img alt="São Tomé and Príncipe" src="https://flagcdn.com/16x12/st.png" width="16" height="12" />
55
+ <img alt="Senegal" src="https://flagcdn.com/16x12/sn.png" width="16" height="12" />
56
+ <img alt="Seychelles" src="https://flagcdn.com/16x12/sc.png" width="16" height="12" />
57
+ <img alt="Sierra Leone" src="https://flagcdn.com/16x12/sl.png" width="16" height="12" />
58
+ <img alt="Somalia" src="https://flagcdn.com/16x12/so.png" width="16" height="12" />
59
+ <img alt="South Africa" src="https://flagcdn.com/16x12/za.png" width="16" height="12" />
60
+ <img alt="South Sudan" src="https://flagcdn.com/16x12/ss.png" width="16" height="12" />
61
+ <img alt="Sudan" src="https://flagcdn.com/16x12/sd.png" width="16" height="12" />
62
+ <img alt="Tanzania" src="https://flagcdn.com/16x12/tz.png" width="16" height="12" />
63
+ <img alt="Togo" src="https://flagcdn.com/16x12/tg.png" width="16" height="12" />
64
+ <img alt="Tunisia" src="https://flagcdn.com/16x12/tn.png" width="16" height="12" />
65
+ <img alt="Uganda" src="https://flagcdn.com/16x12/ug.png" width="16" height="12" />
66
+ <img alt="Zambia" src="https://flagcdn.com/16x12/zm.png" width="16" height="12" />
67
+ <img alt="Zimbabwe" src="https://flagcdn.com/16x12/zw.png" width="16" height="12" />
68
+ </p>
69
+
9
70
  ## Why this exists (the gap we’re filling)
10
71
 
11
72
  Most tools that try “programming in African languages” run into the same wall:
@@ -23,12 +84,21 @@ This project is our attempt to fix that properly:
23
84
  ## What’s in this repo
24
85
 
25
86
  - **25 shipped African language packs** (and a roadmap for more)
26
- - **99 logical tokens** that every pack maps (shared across all programming targets)
87
+ - **112 logical tokens** that every pack maps (shared across all programming targets)
27
88
  - **Schemas + validation** to keep packs consistent
28
89
  - **Coverage checks** against official keyword lists for each target language
29
90
 
30
91
  The data lives under [`packs/`](./packs/). The package published to npm is `@kolanut/language-packs`.
31
92
 
93
+ ## How it fits together
94
+
95
+ In short:
96
+
97
+ - **Logical token registry**: a shared list of concepts (the “meaning layer”)
98
+ - **Official keyword lists**: spec-backed reserved words for each target language
99
+ - **African language packs**: native-language phrases mapped to those concepts
100
+ - **Validation**: ensures packs are complete and spec coverage stays at 0 gaps
101
+
32
102
  <!-- metrics:start -->
33
103
 
34
104
  ## At a glance
@@ -37,7 +107,7 @@ The data lives under [`packs/`](./packs/). The package published to npm is `@kol
37
107
  |---|---:|---:|---|
38
108
  | **African language packs** | 25 | +40 | [`packs/coverage-summary.json`](./packs/coverage-summary.json) · [`packs/languages-roadmap.json`](./packs/languages-roadmap.json) |
39
109
  | **Programming targets** | 5 | +9 | [`packs/coverage-summary.json`](./packs/coverage-summary.json) · [`packs/languages-roadmap.json`](./packs/languages-roadmap.json) |
40
- | **Logical tokens** | 99 | — | [`packs/logical-tokens.json`](./packs/logical-tokens.json) |
110
+ | **Logical tokens** | 112 | — | [`packs/logical-tokens.json`](./packs/logical-tokens.json) |
41
111
  | **Keyword coverage gaps** | 0 | — | [`packs/coverage-summary.json`](./packs/coverage-summary.json) |
42
112
 
43
113
  <!-- metrics:end -->
@@ -49,13 +119,13 @@ Source of truth: [`packs/coverage-summary.json`](./packs/coverage-summary.json)
49
119
 
50
120
  | Target | Spec keywords | Mapped | Gaps | Score |
51
121
  |--------|-------------:|-------:|-----:|------:|
52
- | JavaScript | 38 | 37 direct + 1 structural | 0 | 100% |
53
- | Python | 39 | 38 direct + 1 structural | 0 | 100% |
54
- | TypeScript | 64 tracked† | 63 direct + 1 structural | 0 | 100% |
122
+ | JavaScript | 38 | 38 | 0 | 100% |
123
+ | Python | 39 | 39 | 0 | 100% |
124
+ | TypeScript | 79 tracked† | 79 | 0 | 100% |
55
125
  | Go | 25 | 25 | 0 | 100% |
56
- | Rust | 39 | 38 direct + 1 structural | 0 | 100% |
126
+ | Rust | 39 | 39 | 0 | 100% |
57
127
 
58
- †TypeScript has no single official keyword count in the Handbook; 64 is our tracked reserved/modifier set for coverage (see notes in `official-target-keywords.json`).
128
+ †TypeScript has no single official keyword count in the Handbook; 79 is our tracked reserved/modifier + type-keyword set for coverage (see notes in `official-target-keywords.json`).
59
129
 
60
130
  ## Spec sources (traceable and linkable)
61
131
 
@@ -65,7 +135,7 @@ Source of truth: [`packs/official-target-keywords.json`](./packs/official-target
65
135
  |--------|-------------:|------------|
66
136
  | JavaScript | 38 | [ECMA-262 §12.7.2 ReservedWord](https://tc39.es/ecma262/#sec-keywords-and-reserved-words) |
67
137
  | Python | 39 | [Python 3.12 — keywords](https://docs.python.org/3/reference/lexical_analysis.html#keywords) (35 hard + 4 soft) |
68
- | TypeScript | 64 tracked† | [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html) (no official count) |
138
+ | TypeScript | 79 tracked† | [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html) (no official count) |
69
139
  | Go | 25 | [Go spec — Keywords](https://go.dev/ref/spec#Keywords) |
70
140
  | Rust | 39 | [Rust Reference — strict keywords](https://doc.rust-lang.org/reference/keywords.html) |
71
141
 
@@ -84,7 +154,18 @@ const packs = await listPackNames(); // e.g. 25 packs
84
154
 
85
155
  const yoruba = await loadPack('yoruba');
86
156
  const keywords = flattenKeywords(yoruba);
87
- // { IF: ['ṣé', 'if'], FOR: ['fun', 'for'], ... } — maps 99 logical tokens
157
+ // { IF: ['ṣé', 'if'], FOR: ['fun', 'for'], ... } — maps 112 logical tokens
158
+ ```
159
+
160
+ ## Example: English keywords vs localized phrases (illustrative)
161
+
162
+ Most tools use this package as a **mapping layer**: the official keyword stays the same, but the UI (or source language) can present a localized phrase as an alias.
163
+
164
+ Example (Nigerian Pidgin, illustrative — exact phrases live in the pack):
165
+
166
+ ```text
167
+ IF → "if case say"
168
+ PRINT → "show for screen"
88
169
  ```
89
170
 
90
171
  ## Use the raw JSON (no TS required)
@@ -92,7 +173,7 @@ const keywords = flattenKeywords(yoruba);
92
173
  If you prefer to consume JSON directly (Rust/Go/Python/CLI tools), start here:
93
174
 
94
175
  - [`packs/index.json`](./packs/index.json): pack manifest (locale, region, countries, status)
95
- - [`packs/logical-tokens.json`](./packs/logical-tokens.json): the 99-token registry (the thing packs must fully map)
176
+ - [`packs/logical-tokens.json`](./packs/logical-tokens.json): the 112-token registry (the thing packs must fully map)
96
177
  - [`packs/by-country.json`](./packs/by-country.json): `NG` → `["yoruba", "igbo", ...]`
97
178
  - [`packs/by-region.json`](./packs/by-region.json): region → pack names
98
179
  - [`packs/coverage-summary.json`](./packs/coverage-summary.json): auto-generated coverage report
@@ -103,44 +184,44 @@ If you prefer to consume JSON directly (Rust/Go/Python/CLI tools), start here:
103
184
  These are the packs currently shipped in v0.1.
104
185
 
105
186
  - Flags are shown for the **primary locale** (quick scanning). Many packs apply to multiple countries—see [`packs/index.json`](./packs/index.json) for the full list.
106
- - **On GitHub, flags render as images**, so they should display even if your laptop doesn’t support emoji flags. (In some local Markdown previews, they may appear as squares.)
187
+ - We use **Twemoji flag images** (not emoji characters) so the flags render reliably on both GitHub and npm.
107
188
 
108
189
  **West Africa**
109
- - 🇳🇬 Yorùbá (`yo-NG`)
110
- - 🇳🇬 Nigerian Pidgin (`pcm-NG`)
111
- - 🇳🇬 Hausa (`ha-NG`)
112
- - 🇳🇬 Igbo (`ig-NG`)
113
- - 🇳🇬 Fulfulde (`ff-NG`)
114
- - 🇲🇱 Bambara (`bm-ML`)
115
- - 🇬🇭 Twi (`tw-GH`)
116
- - 🇸🇳 Wolof (`wo-SN`)
117
- - 🇸🇳 French (Africa) (`fr-SN`)
190
+ - <img alt="NG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg" width="16" height="16" /> Yorùbá (`yo-NG`)
191
+ - <img alt="NG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg" width="16" height="16" /> Nigerian Pidgin (`pcm-NG`)
192
+ - <img alt="NG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg" width="16" height="16" /> Hausa (`ha-NG`)
193
+ - <img alt="NG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg" width="16" height="16" /> Igbo (`ig-NG`)
194
+ - <img alt="NG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg" width="16" height="16" /> Fulfulde (`ff-NG`)
195
+ - <img alt="ML" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f2-1f1f1.svg" width="16" height="16" /> Bambara (`bm-ML`)
196
+ - <img alt="GH" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ec-1f1ed.svg" width="16" height="16" /> Twi (`tw-GH`)
197
+ - <img alt="SN" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f8-1f1f3.svg" width="16" height="16" /> Wolof (`wo-SN`)
198
+ - <img alt="SN" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f8-1f1f3.svg" width="16" height="16" /> French (Africa) (`fr-SN`)
118
199
 
119
200
  **East Africa**
120
- - 🇰🇪 Swahili (`sw-KE`)
121
- - 🇪🇹 Amharic (`am-ET`)
122
- - 🇪🇹 Oromo (`om-ET`)
123
- - 🇪🇷 Tigrinya (`ti-ER`)
124
- - 🇷🇼 Kinyarwanda (`rw-RW`)
125
- - 🇺🇬 Luganda (`lg-UG`)
201
+ - <img alt="KE" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f0-1f1ea.svg" width="16" height="16" /> Swahili (`sw-KE`)
202
+ - <img alt="ET" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1f9.svg" width="16" height="16" /> Amharic (`am-ET`)
203
+ - <img alt="ET" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1f9.svg" width="16" height="16" /> Oromo (`om-ET`)
204
+ - <img alt="ER" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1f7.svg" width="16" height="16" /> Tigrinya (`ti-ER`)
205
+ - <img alt="RW" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f7-1f1fc.svg" width="16" height="16" /> Kinyarwanda (`rw-RW`)
206
+ - <img alt="UG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1fa-1f1ec.svg" width="16" height="16" /> Luganda (`lg-UG`)
126
207
 
127
208
  **Central Africa**
128
- - 🇨🇩 Lingala (`ln-CD`)
209
+ - <img alt="CD" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e8-1f1e9.svg" width="16" height="16" /> Lingala (`ln-CD`)
129
210
 
130
211
  **Horn of Africa**
131
- - 🇸🇴 Somali (`so-SO`)
212
+ - <img alt="SO" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f8-1f1f4.svg" width="16" height="16" /> Somali (`so-SO`)
132
213
 
133
214
  **North / East Africa**
134
- - 🇪🇬 Arabic (Africa) (`ar-EG`)
215
+ - <img alt="EG" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1ec.svg" width="16" height="16" /> Arabic (Africa) (`ar-EG`)
135
216
 
136
217
  **Southern Africa**
137
- - 🇿🇦 isiZulu (`zu-ZA`)
138
- - 🇿🇦 isiXhosa (`xh-ZA`)
139
- - 🇿🇦 Afrikaans (`af-ZA`)
140
- - 🇱🇸 Sesotho (`st-LS`)
141
- - 🇧🇼 Setswana (`tn-BW`)
142
- - 🇿🇼 Shona (`sn-ZW`)
143
- - 🇦🇴 Portuguese (Africa) (`pt-AO`)
218
+ - <img alt="ZA" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1e6.svg" width="16" height="16" /> isiZulu (`zu-ZA`)
219
+ - <img alt="ZA" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1e6.svg" width="16" height="16" /> isiXhosa (`xh-ZA`)
220
+ - <img alt="ZA" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1e6.svg" width="16" height="16" /> Afrikaans (`af-ZA`)
221
+ - <img alt="LS" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f1-1f1f8.svg" width="16" height="16" /> Sesotho (`st-LS`)
222
+ - <img alt="BW" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e7-1f1fc.svg" width="16" height="16" /> Setswana (`tn-BW`)
223
+ - <img alt="ZW" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1fc.svg" width="16" height="16" /> Shona (`sn-ZW`)
224
+ - <img alt="AO" src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e6-1f1f4.svg" width="16" height="16" /> Portuguese (Africa) (`pt-AO`)
144
225
 
145
226
  Full metadata (including all countries per pack): [`packs/index.json`](./packs/index.json).
146
227
 
@@ -152,10 +233,14 @@ If you care about linguistic accuracy or preferred terminology for a specific co
152
233
 
153
234
  ## Roadmap (what’s next)
154
235
 
155
- We track two roadmaps:
236
+ We track roadmaps in [`packs/languages-roadmap.json`](./packs/languages-roadmap.json):
156
237
 
157
- - **Planned African languages** (by region + priority): [`packs/languages-roadmap.json`](./packs/languages-roadmap.json)
158
- - **Planned programming targets**: C, C++, Java, C#, Kotlin, Swift, Dart, Ruby, PHP
238
+ - **Planned African languages** (by region + priority) — 40 more packs on the list
239
+ - **Planned programming targets** C, C++, Java, C#, Kotlin, Swift, Dart, Ruby, PHP (one target per release; sample keywords + checklist in the JSON)
240
+ - **Planned logical tokens** — `GEN` (Rust 2024), `LAZY` (Python 3.15 / PEP 810) → target **v0.2.0**
241
+ - **Planned token tier** — stdlib / builtins (`len`, `map`, `Array`, `fmt`, …) → target **v2.0.0** (design-first; not required for beginner keyword transpilation)
242
+
243
+ Suggested release sequence (also in the JSON): **v0.1.x** (current) → **v0.2.0** (GEN/LAZY) → **v0.3.0+** (new targets, one at a time) → **v2.0.0** (stdlib tier).
159
244
 
160
245
  Regional focus (how we’re sequencing the work):
161
246
 
@@ -173,7 +258,7 @@ High-priority upcoming packs currently include:
173
258
  Contributions are welcome—especially from native speakers and educators.
174
259
 
175
260
  - **Improve an existing pack**: add better phrasing, aliases for dialects, or clearer scope notes
176
- - **Add a new pack**: follow the template, map all 99 tokens, and run validation
261
+ - **Add a new pack**: follow the template, map all 112 tokens, and run validation
177
262
 
178
263
  Before contributing, please read [`packs/PACK_SCOPE.md`](./packs/PACK_SCOPE.md). It explains:
179
264
 
@@ -193,6 +278,13 @@ npm run build
193
278
 
194
279
  Full guide: [`CONTRIBUTING.md`](./CONTRIBUTING.md).
195
280
 
281
+ ### Contribution flow (quick)
282
+
283
+ 1. Choose a pack scope (or create a new variant)
284
+ 2. Translate tokens (use aliases for dialect differences)
285
+ 3. Run `npm test` (validate + coverage)
286
+ 4. Open a PR for native-speaker review
287
+
196
288
  ## Contributors
197
289
 
198
290
  This project only works if real people show up with real language knowledge. Thank you to everyone who’s contributed time, expertise, and care.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolanut/language-packs",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Community-governed keyword maps for native African language programming — by Kolanut Technologies",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Kolanut Technologies Ltd (https://kolacode.africa)",
@@ -18,7 +18,6 @@
18
18
  "files": [
19
19
  "dist",
20
20
  "packs",
21
- "badges",
22
21
  "pack.schema.json",
23
22
  "LICENSE",
24
23
  "README.md",
@@ -314,6 +314,45 @@
314
314
  "SATISFIES": [
315
315
  "satisfies"
316
316
  ],
317
+ "ANY": [
318
+ "any"
319
+ ],
320
+ "BOOLEAN": [
321
+ "boolean"
322
+ ],
323
+ "NUMBER": [
324
+ "number"
325
+ ],
326
+ "STRING": [
327
+ "string"
328
+ ],
329
+ "SYMBOL": [
330
+ "symbol"
331
+ ],
332
+ "OBJECT": [
333
+ "object"
334
+ ],
335
+ "NEVER": [
336
+ "never"
337
+ ],
338
+ "UNKNOWN": [
339
+ "unknown"
340
+ ],
341
+ "BIGINT": [
342
+ "bigint"
343
+ ],
344
+ "CONSTRUCTOR": [
345
+ "constructor"
346
+ ],
347
+ "REQUIRE": [
348
+ "require"
349
+ ],
350
+ "USING": [
351
+ "using"
352
+ ],
353
+ "OF": [
354
+ "of"
355
+ ],
317
356
  "DYN": [
318
357
  "dyn"
319
358
  ],
@@ -9,7 +9,7 @@
9
9
  "regions": [
10
10
  "Southern Africa"
11
11
  ],
12
- "version": "0.1.0",
12
+ "version": "0.1.1",
13
13
  "displayName": "Afrikaans",
14
14
  "description": "Afrikaans keyword map — starter pack (community contributions welcome)",
15
15
  "reviewStatus": "starter",
@@ -339,6 +339,45 @@
339
339
  "SATISFIES": [
340
340
  "satisfies"
341
341
  ],
342
+ "ANY": [
343
+ "any"
344
+ ],
345
+ "BOOLEAN": [
346
+ "boolean"
347
+ ],
348
+ "NUMBER": [
349
+ "number"
350
+ ],
351
+ "STRING": [
352
+ "string"
353
+ ],
354
+ "SYMBOL": [
355
+ "symbol"
356
+ ],
357
+ "OBJECT": [
358
+ "object"
359
+ ],
360
+ "NEVER": [
361
+ "never"
362
+ ],
363
+ "UNKNOWN": [
364
+ "unknown"
365
+ ],
366
+ "BIGINT": [
367
+ "bigint"
368
+ ],
369
+ "CONSTRUCTOR": [
370
+ "constructor"
371
+ ],
372
+ "REQUIRE": [
373
+ "require"
374
+ ],
375
+ "USING": [
376
+ "using"
377
+ ],
378
+ "OF": [
379
+ "of"
380
+ ],
342
381
  "DYN": [
343
382
  "dyn"
344
383
  ],
@@ -314,6 +314,45 @@
314
314
  "SATISFIES": [
315
315
  "satisfies"
316
316
  ],
317
+ "ANY": [
318
+ "any"
319
+ ],
320
+ "BOOLEAN": [
321
+ "boolean"
322
+ ],
323
+ "NUMBER": [
324
+ "number"
325
+ ],
326
+ "STRING": [
327
+ "string"
328
+ ],
329
+ "SYMBOL": [
330
+ "symbol"
331
+ ],
332
+ "OBJECT": [
333
+ "object"
334
+ ],
335
+ "NEVER": [
336
+ "never"
337
+ ],
338
+ "UNKNOWN": [
339
+ "unknown"
340
+ ],
341
+ "BIGINT": [
342
+ "bigint"
343
+ ],
344
+ "CONSTRUCTOR": [
345
+ "constructor"
346
+ ],
347
+ "REQUIRE": [
348
+ "require"
349
+ ],
350
+ "USING": [
351
+ "using"
352
+ ],
353
+ "OF": [
354
+ "of"
355
+ ],
317
356
  "DYN": [
318
357
  "dyn"
319
358
  ],
@@ -8,7 +8,7 @@
8
8
  "regions": [
9
9
  "East Africa"
10
10
  ],
11
- "version": "0.1.0",
11
+ "version": "0.1.1",
12
12
  "displayName": "Amharic",
13
13
  "description": "Amharic keyword map — starter pack (community contributions welcome)",
14
14
  "reviewStatus": "starter",
@@ -338,6 +338,45 @@
338
338
  "SATISFIES": [
339
339
  "satisfies"
340
340
  ],
341
+ "ANY": [
342
+ "any"
343
+ ],
344
+ "BOOLEAN": [
345
+ "boolean"
346
+ ],
347
+ "NUMBER": [
348
+ "number"
349
+ ],
350
+ "STRING": [
351
+ "string"
352
+ ],
353
+ "SYMBOL": [
354
+ "symbol"
355
+ ],
356
+ "OBJECT": [
357
+ "object"
358
+ ],
359
+ "NEVER": [
360
+ "never"
361
+ ],
362
+ "UNKNOWN": [
363
+ "unknown"
364
+ ],
365
+ "BIGINT": [
366
+ "bigint"
367
+ ],
368
+ "CONSTRUCTOR": [
369
+ "constructor"
370
+ ],
371
+ "REQUIRE": [
372
+ "require"
373
+ ],
374
+ "USING": [
375
+ "using"
376
+ ],
377
+ "OF": [
378
+ "of"
379
+ ],
341
380
  "DYN": [
342
381
  "dyn"
343
382
  ],
@@ -314,6 +314,45 @@
314
314
  "SATISFIES": [
315
315
  "satisfies"
316
316
  ],
317
+ "ANY": [
318
+ "any"
319
+ ],
320
+ "BOOLEAN": [
321
+ "boolean"
322
+ ],
323
+ "NUMBER": [
324
+ "number"
325
+ ],
326
+ "STRING": [
327
+ "string"
328
+ ],
329
+ "SYMBOL": [
330
+ "symbol"
331
+ ],
332
+ "OBJECT": [
333
+ "object"
334
+ ],
335
+ "NEVER": [
336
+ "never"
337
+ ],
338
+ "UNKNOWN": [
339
+ "unknown"
340
+ ],
341
+ "BIGINT": [
342
+ "bigint"
343
+ ],
344
+ "CONSTRUCTOR": [
345
+ "constructor"
346
+ ],
347
+ "REQUIRE": [
348
+ "require"
349
+ ],
350
+ "USING": [
351
+ "using"
352
+ ],
353
+ "OF": [
354
+ "of"
355
+ ],
317
356
  "DYN": [
318
357
  "dyn"
319
358
  ],
@@ -18,7 +18,7 @@
18
18
  "North Africa",
19
19
  "East Africa"
20
20
  ],
21
- "version": "0.1.0",
21
+ "version": "0.1.1",
22
22
  "displayName": "Arabic",
23
23
  "description": "Arabic keyword map for North and East Africa — starter pack",
24
24
  "reviewStatus": "starter",
@@ -348,6 +348,45 @@
348
348
  "SATISFIES": [
349
349
  "satisfies"
350
350
  ],
351
+ "ANY": [
352
+ "any"
353
+ ],
354
+ "BOOLEAN": [
355
+ "boolean"
356
+ ],
357
+ "NUMBER": [
358
+ "number"
359
+ ],
360
+ "STRING": [
361
+ "string"
362
+ ],
363
+ "SYMBOL": [
364
+ "symbol"
365
+ ],
366
+ "OBJECT": [
367
+ "object"
368
+ ],
369
+ "NEVER": [
370
+ "never"
371
+ ],
372
+ "UNKNOWN": [
373
+ "unknown"
374
+ ],
375
+ "BIGINT": [
376
+ "bigint"
377
+ ],
378
+ "CONSTRUCTOR": [
379
+ "constructor"
380
+ ],
381
+ "REQUIRE": [
382
+ "require"
383
+ ],
384
+ "USING": [
385
+ "using"
386
+ ],
387
+ "OF": [
388
+ "of"
389
+ ],
351
390
  "DYN": [
352
391
  "dyn"
353
392
  ],
@@ -284,6 +284,45 @@
284
284
  "SATISFIES": [
285
285
  "satisfies"
286
286
  ],
287
+ "ANY": [
288
+ "any"
289
+ ],
290
+ "BOOLEAN": [
291
+ "boolean"
292
+ ],
293
+ "NUMBER": [
294
+ "number"
295
+ ],
296
+ "STRING": [
297
+ "string"
298
+ ],
299
+ "SYMBOL": [
300
+ "symbol"
301
+ ],
302
+ "OBJECT": [
303
+ "object"
304
+ ],
305
+ "NEVER": [
306
+ "never"
307
+ ],
308
+ "UNKNOWN": [
309
+ "unknown"
310
+ ],
311
+ "BIGINT": [
312
+ "bigint"
313
+ ],
314
+ "CONSTRUCTOR": [
315
+ "constructor"
316
+ ],
317
+ "REQUIRE": [
318
+ "require"
319
+ ],
320
+ "USING": [
321
+ "using"
322
+ ],
323
+ "OF": [
324
+ "of"
325
+ ],
287
326
  "DYN": [
288
327
  "dyn"
289
328
  ],