{"id":51550679,"url":"https://github.com/kolanuttechnologies/kola-language-packs","last_synced_at":"2026-07-10T00:00:17.969Z","repository":{"id":369958157,"uuid":"1288732657","full_name":"KolanutTechnologies/kola-language-packs","owner":"KolanutTechnologies","description":"Community keyword maps for programming in Swahili, Yoruba, Pidgin, Hausa, and other African languages.","archived":false,"fork":false,"pushed_at":"2026-07-07T15:49:14.000Z","size":190,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-07T17:06:42.151Z","etag":null,"topics":["africa","african-languages","african-tech","apache-2","east-africa","hausa","i18n","kolanut-tech","localization","nigeria","north-africa","npm-package","open-source","pidgin","programming-languages","south-africa","swahili","west-africa","yoruba"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KolanutTechnologies.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-03T23:01:09.000Z","updated_at":"2026-07-07T15:51:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/KolanutTechnologies/kola-language-packs","commit_stats":null,"previous_names":["kolanuttechnologies/kola-language-packs"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/KolanutTechnologies/kola-language-packs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KolanutTechnologies%2Fkola-language-packs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KolanutTechnologies%2Fkola-language-packs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KolanutTechnologies%2Fkola-language-packs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KolanutTechnologies%2Fkola-language-packs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KolanutTechnologies","download_url":"https://codeload.github.com/KolanutTechnologies/kola-language-packs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KolanutTechnologies%2Fkola-language-packs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35315894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["africa","african-languages","african-tech","apache-2","east-africa","hausa","i18n","kolanut-tech","localization","nigeria","north-africa","npm-package","open-source","pidgin","programming-languages","south-africa","swahili","west-africa","yoruba"],"created_at":"2026-07-10T00:00:17.214Z","updated_at":"2026-07-10T00:00:17.957Z","avatar_url":"https://github.com/KolanutTechnologies.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @kolanut/language-packs\n\n**Language pack registry for African programming tools** · Apache 2.0 · [Kolanut Technologies Ltd](https://kolacode.africa)\n\nNot a standalone programming language (unlike Nuru, Yorlang, or similar runtimes). This repo ships **keyword maps and IDE gloss data** for editors, transpilers, and learning tools.\n\n\u003c!-- badges:start --\u003e\n\n[![npm](https://img.shields.io/npm/v/%40kolanut%2Flanguage-packs)](https://www.npmjs.com/package/@kolanut/language-packs)\n[![npm downloads](https://img.shields.io/npm/dw/%40kolanut%2Flanguage-packs)](https://www.npmjs.com/package/@kolanut/language-packs)\n[![Language pack registry](https://img.shields.io/badge/Language%20pack%20registry-for%20programming%20tools-2ea44f)](./packs/PACK_SCOPE.md)\n[![GitHub](https://img.shields.io/badge/GitHub-View%20%26%20star-181717?logo=github)](https://github.com/KolanutTechnologies/kola-language-packs)\n[![African language packs](https://img.shields.io/badge/African%20language%20packs-28-gold)](./packs/coverage-summary.json)\n[![Programming targets](https://img.shields.io/badge/Programming%20targets-15-blue)](./packs/coverage-summary.json)\n[![Logical tokens](https://img.shields.io/badge/Logical%20tokens-370-lightgrey)](./packs/logical-tokens.json)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n\u003c!-- badges:end --\u003e\n\nBuilding with these packs? [Star the repo on GitHub](https://github.com/KolanutTechnologies/kola-language-packs) to follow releases and support African-language programming.\n\n\u003c!-- intro-targets:start --\u003e\nLanguage 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, Rust, Java, C, C++, C#, Kotlin, Swift, Dart, Ruby, PHP, and R**.\n\u003c!-- intro-targets:end --\u003e\n\nIf you’re building an editor, a transpiler, a linter, or a learning tool, this repo is the shared “source of truth”.\n\nAfrica-first:\n\n\u003cp\u003e\n  \u003cimg alt=\"Algeria\" src=\"https://flagcdn.com/16x12/dz.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Angola\" src=\"https://flagcdn.com/16x12/ao.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Benin\" src=\"https://flagcdn.com/16x12/bj.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Botswana\" src=\"https://flagcdn.com/16x12/bw.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Burkina Faso\" src=\"https://flagcdn.com/16x12/bf.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Burundi\" src=\"https://flagcdn.com/16x12/bi.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Cabo Verde\" src=\"https://flagcdn.com/16x12/cv.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Cameroon\" src=\"https://flagcdn.com/16x12/cm.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Central African Republic\" src=\"https://flagcdn.com/16x12/cf.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Chad\" src=\"https://flagcdn.com/16x12/td.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Comoros\" src=\"https://flagcdn.com/16x12/km.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Congo (Republic)\" src=\"https://flagcdn.com/16x12/cg.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Congo (DRC)\" src=\"https://flagcdn.com/16x12/cd.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Djibouti\" src=\"https://flagcdn.com/16x12/dj.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Egypt\" src=\"https://flagcdn.com/16x12/eg.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Equatorial Guinea\" src=\"https://flagcdn.com/16x12/gq.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Eritrea\" src=\"https://flagcdn.com/16x12/er.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Eswatini\" src=\"https://flagcdn.com/16x12/sz.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Ethiopia\" src=\"https://flagcdn.com/16x12/et.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Gabon\" src=\"https://flagcdn.com/16x12/ga.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Gambia\" src=\"https://flagcdn.com/16x12/gm.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Ghana\" src=\"https://flagcdn.com/16x12/gh.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Guinea\" src=\"https://flagcdn.com/16x12/gn.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Guinea-Bissau\" src=\"https://flagcdn.com/16x12/gw.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Ivory Coast\" src=\"https://flagcdn.com/16x12/ci.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Kenya\" src=\"https://flagcdn.com/16x12/ke.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Lesotho\" src=\"https://flagcdn.com/16x12/ls.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Liberia\" src=\"https://flagcdn.com/16x12/lr.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Libya\" src=\"https://flagcdn.com/16x12/ly.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Madagascar\" src=\"https://flagcdn.com/16x12/mg.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Malawi\" src=\"https://flagcdn.com/16x12/mw.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Mali\" src=\"https://flagcdn.com/16x12/ml.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Mauritania\" src=\"https://flagcdn.com/16x12/mr.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Mauritius\" src=\"https://flagcdn.com/16x12/mu.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Morocco\" src=\"https://flagcdn.com/16x12/ma.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Mozambique\" src=\"https://flagcdn.com/16x12/mz.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Namibia\" src=\"https://flagcdn.com/16x12/na.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Niger\" src=\"https://flagcdn.com/16x12/ne.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Nigeria\" src=\"https://flagcdn.com/16x12/ng.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Rwanda\" src=\"https://flagcdn.com/16x12/rw.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"São Tomé and Príncipe\" src=\"https://flagcdn.com/16x12/st.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Senegal\" src=\"https://flagcdn.com/16x12/sn.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Seychelles\" src=\"https://flagcdn.com/16x12/sc.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Sierra Leone\" src=\"https://flagcdn.com/16x12/sl.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Somalia\" src=\"https://flagcdn.com/16x12/so.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"South Africa\" src=\"https://flagcdn.com/16x12/za.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"South Sudan\" src=\"https://flagcdn.com/16x12/ss.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Sudan\" src=\"https://flagcdn.com/16x12/sd.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Tanzania\" src=\"https://flagcdn.com/16x12/tz.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Togo\" src=\"https://flagcdn.com/16x12/tg.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Tunisia\" src=\"https://flagcdn.com/16x12/tn.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Uganda\" src=\"https://flagcdn.com/16x12/ug.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Zambia\" src=\"https://flagcdn.com/16x12/zm.png\" width=\"16\" height=\"12\" /\u003e\n  \u003cimg alt=\"Zimbabwe\" src=\"https://flagcdn.com/16x12/zw.png\" width=\"16\" height=\"12\" /\u003e\n\u003c/p\u003e\n\n## Why this exists (the gap we’re filling)\n\nMost tools that try “programming in African languages” run into the same wall:\n\n- **There’s no single public, spec-backed registry** that says *“these are the official reserved words for each target language”* and *“these are the logical concepts they map to”*.\n- Even when translation resources exist, they’re often **not packaged, not versioned, and not reusable** across tools.\n\nThis project is our attempt to fix that properly:\n\n- A canonical **logical token registry** (the concepts)\n- A canonical **official keyword list per programming target** (the specs)\n- A growing set of **African language packs** (the human-language layer)\n- Validation so everyone can build on top of the same foundation with confidence\n\n## Standards-aligned metadata\n\nPack metadata follows international conventions so tools worldwide can consume our data:\n\n| Standard | Field | Example |\n|----------|-------|---------|\n| [ISO 639](https://www.loc.gov/standards/iso639-2/php/code_list.php) | `languageCode` | `sw` (Swahili), `wo` (Wolof), `zu` (isiZulu) |\n| [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) | `countries` | `KE`, `SN`, `ZA`, `EG` |\n| [BCP-47](https://www.rfc-editor.org/info/bcp47) | `locale` | `sw-KE`, `wo-SN`, `ar-EG` |\n\nWe use the same code systems as major platforms and localization projects — **standards-aligned**, not a custom Kolanut-only format. Plain English: [`packs/GLOSSARY.md`](./packs/GLOSSARY.md).\n\n## What’s in this repo\n\n\u003c!-- whats-in-repo:start --\u003e\n- **28 shipped African language packs** (and a roadmap for more)\n- **370 logical tokens** that every pack maps (shared across all programming targets)\n\u003c!-- whats-in-repo:end --\u003e\n\n- **Schemas + validation** to keep packs consistent\n- **Coverage checks** against official keyword lists for each target language\n\nThe data lives under [`packs/`](./packs/). The package published to npm is `@kolanut/language-packs`.\n\n## How it fits together\n\nIn short:\n\n- **Logical token registry**: a shared list of concepts (the “meaning layer”)\n- **Official keyword lists**: spec-backed reserved words for each target language\n- **African language packs**: native-language phrases mapped to those concepts\n- **Validation**: ensures packs are complete and spec coverage stays at 0 gaps\n\n\u003c!-- metrics:start --\u003e\n\n## At a glance\n\n| What we cover | Shipped | Planned | Source of truth |\n|---|---:|---:|---|\n| **African language packs** | 28 | +40 | [`packs/coverage-summary.json`](./packs/coverage-summary.json) · [`packs/languages-roadmap.json`](./packs/languages-roadmap.json) |\n| **Programming targets** | 15 | +5 | [`packs/coverage-summary.json`](./packs/coverage-summary.json) · [`packs/languages-roadmap.json`](./packs/languages-roadmap.json) |\n| **Logical tokens** | 370 | — | [`packs/logical-tokens.json`](./packs/logical-tokens.json) |\n| **Keyword coverage gaps** | 0 | — | [`packs/coverage-summary.json`](./packs/coverage-summary.json) |\n\n\u003c!-- metrics:end --\u003e\n\n## Keyword coverage (0 gaps)\n\nWe track coverage against official reserved keywords for each transpile target. Some concepts are “structural” (they don’t have a 1:1 keyword in a given language, but still need a consistent logical token).\n\nSource of truth: [`packs/coverage-summary.json`](./packs/coverage-summary.json)\n\n\u003c!-- coverage-table:start --\u003e\n| Target | Spec keywords | Mapped | Gaps | Score |\n|--------|-------------:|-------:|-----:|------:|\n| JavaScript | 38 | 38 | 0 | 100% |\n| Python | 40 | 40 | 0 | 100% |\n| TypeScript | 79 tracked† | 79 | 0 | 100% |\n| Go | 25 | 25 | 0 | 100% |\n| Rust | 40 | 40 | 0 | 100% |\n| Java | 51 | 51 | 0 | 100% |\n| C | 45 | 45 | 0 | 100% |\n| C++ | 92 | 92 | 0 | 100% |\n| C# | 104 | 104 | 0 | 100% |\n| Kotlin | 80 | 80 | 0 | 100% |\n| Swift | 90 | 90 | 0 | 100% |\n| Dart | 68 | 68 | 0 | 100% |\n| Ruby | 41 | 41 | 0 | 100% |\n| PHP | 81 | 81 | 0 | 100% |\n| R | 29 | 29 | 0 | 100% |\n\u003c!-- coverage-table:end --\u003e\n\n\u003c!-- coverage-footnote:start --\u003e\n†TypeScript has no single official keyword count in the Handbook; the tracked count is our reserved/modifier + type-keyword set for coverage (see notes in `official-target-keywords.json`).\n\u003c!-- coverage-footnote:end --\u003e\n\n## Spec sources (traceable and linkable)\n\nSource of truth: [`packs/official-target-keywords.json`](./packs/official-target-keywords.json)\n\n\u003c!-- spec-sources-table:start --\u003e\n| Target | Spec keywords | Spec source |\n|--------|-------------:|------------|\n| JavaScript | 38 | [ECMA-262 Edition 15](https://tc39.es/ecma262/#sec-keywords-and-reserved-words) |\n| Python | 40 | [Python 3.12 Language Reference](https://docs.python.org/3/reference/lexical_analysis.html#keywords) |\n| TypeScript | 79 tracked† | [TypeScript — tracked reserved tokens (practical set)](https://www.typescriptlang.org/docs/handbook/intro.html) |\n| Go | 25 | [The Go Programming Language Specification](https://go.dev/ref/spec#Keywords) |\n| Rust | 40 | [The Rust Reference — Keywords](https://doc.rust-lang.org/reference/keywords.html) |\n| Java | 51 | [Java Language Specification (Java SE 21)](https://docs.oracle.com/javase/specs/jls/se21/html/jls-3.html#jls-3.9) |\n| C | 45 | [ISO/IEC 9899:2011 (C11) — Keywords](https://en.cppreference.com/w/c/keyword) |\n| C++ | 92 | [ISO C++20 — Keywords (cppreference)](https://en.cppreference.com/w/cpp/keyword) |\n| C# | 104 | [C# 12 — Keywords (Microsoft Learn)](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/) |\n| Kotlin | 80 | [Kotlin — Keywords and operators](https://kotlinlang.org/docs/keywords.html) |\n| Swift | 90 | [The Swift Programming Language — Lexical Structure](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/) |\n| Dart | 68 | [Dart 3.12 — Language keywords](https://dart.dev/language/keywords) |\n| Ruby | 41 | [Ruby 3.2 — Keywords](https://docs.ruby-lang.org/en/3.2/keywords_rdoc.html) |\n| PHP | 81 | [PHP 8.3 — Reserved keywords](https://www.php.net/manual/en/reserved.keywords.php) |\n| R | 29 | [R Language Definition — Reserved words](https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Reserved-words) |\n\u003c!-- spec-sources-table:end --\u003e\n\n## Install\n\n```bash\nnpm install @kolanut/language-packs\n```\n\n## Use it in code\n\n\u003c!-- code-example-stats:start --\u003e\n```typescript\nimport { listPackNames, loadPack, flattenKeywords } from '@kolanut/language-packs';\n\nconst packs = await listPackNames(); // e.g. 28 packs\n\nconst yoruba = await loadPack('yoruba');\nconst keywords = flattenKeywords(yoruba);\n// { IF: ['ṣé', 'if'], FOR: ['fun', 'for'], ... } — maps 370 logical tokens\n```\n\u003c!-- code-example-stats:end --\u003e\n\n## Example: English keywords vs localized phrases (illustrative)\n\nMost 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.\n\nExample (Nigerian Pidgin, illustrative — exact phrases live in the pack):\n\n```text\nIF    → \"if case say\"\nPRINT → \"show for screen\"\n```\n\n## Use the raw JSON (no TS required)\n\nIf you prefer to consume JSON directly (Rust/Go/Python/CLI tools), start here:\n\n- [`packs/index.json`](./packs/index.json): pack manifest (locale, region, countries, status)\n- [`packs/language-registry.json`](./packs/language-registry.json): taken and planned `name` / `locale` / `languageCode` (check before adding a pack)\n- [`packs/NAMING_GUIDE.md`](./packs/NAMING_GUIDE.md): how to name packs and write locales\n- [`packs/logical-tokens.json`](./packs/logical-tokens.json): the 370-token registry (the thing packs must fully map)\n- [`packs/by-country.json`](./packs/by-country.json): `NG` → `[\"yoruba\", \"igbo\", ...]`\n- [`packs/by-region.json`](./packs/by-region.json): region → pack names\n- [`packs/coverage-summary.json`](./packs/coverage-summary.json): auto-generated coverage report\n- [`packs/ROADMAP.md`](./packs/ROADMAP.md): version plan (0.12 → 1.0 → 2.0)\n- [`packs/TIERS.md`](./packs/TIERS.md): pack layers and scope ceilings\n- [`packs/languages-roadmap.json`](./packs/languages-roadmap.json): shipped vs planned packs (machine-readable)\n\n\u003c!-- shipped-languages-heading:start --\u003e\n## Languages shipped (28)\n\u003c!-- shipped-languages-heading:end --\u003e\n\nThese are the 28 packs currently shipped.\n\n- 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.\n- We use **Twemoji flag images** (not emoji characters) so the flags render reliably on both GitHub and npm.\n\n\u003c!-- shipped-languages-list:start --\u003e\n**West Africa**\n- \u003cimg alt=\"GH\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ec-1f1ed.svg\" width=\"16\" height=\"16\" /\u003e Akan (`ak-GH`)\n- \u003cimg alt=\"ML\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f2-1f1f1.svg\" width=\"16\" height=\"16\" /\u003e Bambara (`bm-ML`)\n- \u003cimg alt=\"NG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Efik (`efi-NG`)\n- \u003cimg alt=\"SN\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f8-1f1f3.svg\" width=\"16\" height=\"16\" /\u003e French (`fr-SN`)\n- \u003cimg alt=\"NG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Fulfulde (`ff-NG`)\n- \u003cimg alt=\"NG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Hausa (`ha-NG`)\n- \u003cimg alt=\"NG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Igbo (`ig-NG`)\n- \u003cimg alt=\"NG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Nigerian Pidgin (`pcm-NG`)\n- \u003cimg alt=\"GH\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ec-1f1ed.svg\" width=\"16\" height=\"16\" /\u003e Twi (`tw-GH`)\n- \u003cimg alt=\"SN\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f8-1f1f3.svg\" width=\"16\" height=\"16\" /\u003e Wolof (`wo-SN`)\n- \u003cimg alt=\"NG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f3-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Yorùbá (`yo-NG`)\n\n**East Africa**\n- \u003cimg alt=\"ET\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1f9.svg\" width=\"16\" height=\"16\" /\u003e Amharic (`am-ET`)\n- \u003cimg alt=\"RW\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f7-1f1fc.svg\" width=\"16\" height=\"16\" /\u003e Kinyarwanda (`rw-RW`)\n- \u003cimg alt=\"UG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1fa-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Luganda (`lg-UG`)\n- \u003cimg alt=\"ET\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1f9.svg\" width=\"16\" height=\"16\" /\u003e Oromo (`om-ET`)\n- \u003cimg alt=\"KE\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f0-1f1ea.svg\" width=\"16\" height=\"16\" /\u003e Swahili (`sw-KE`)\n- \u003cimg alt=\"ER\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1f7.svg\" width=\"16\" height=\"16\" /\u003e Tigrinya (`ti-ER`)\n\n**Central Africa**\n- \u003cimg alt=\"CM\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e8-1f1f2.svg\" width=\"16\" height=\"16\" /\u003e Cameroon Pidgin (`wes-CM`)\n- \u003cimg alt=\"CD\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e8-1f1e9.svg\" width=\"16\" height=\"16\" /\u003e Lingala (`ln-CD`)\n\n**Horn of Africa**\n- \u003cimg alt=\"SO\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f8-1f1f4.svg\" width=\"16\" height=\"16\" /\u003e Somali (`so-SO`)\n\n**North / East Africa**\n- \u003cimg alt=\"EG\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ea-1f1ec.svg\" width=\"16\" height=\"16\" /\u003e Arabic (`ar-EG`)\n\n**Southern Africa**\n- \u003cimg alt=\"ZA\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1e6.svg\" width=\"16\" height=\"16\" /\u003e Afrikaans (`af-ZA`)\n- \u003cimg alt=\"ZA\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1e6.svg\" width=\"16\" height=\"16\" /\u003e isiXhosa (`xh-ZA`)\n- \u003cimg alt=\"ZA\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1e6.svg\" width=\"16\" height=\"16\" /\u003e isiZulu (`zu-ZA`)\n- \u003cimg alt=\"AO\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e6-1f1f4.svg\" width=\"16\" height=\"16\" /\u003e Portuguese (Africa) (`pt-AO`)\n- \u003cimg alt=\"LS\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1f1-1f1f8.svg\" width=\"16\" height=\"16\" /\u003e Sesotho (`st-LS`)\n- \u003cimg alt=\"BW\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1e7-1f1fc.svg\" width=\"16\" height=\"16\" /\u003e Setswana (`tn-BW`)\n- \u003cimg alt=\"ZW\" src=\"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f1ff-1f1fc.svg\" width=\"16\" height=\"16\" /\u003e Shona (`sn-ZW`)\n\u003c!-- shipped-languages-list:end --\u003e\n\nFull metadata (including all countries per pack): [`packs/index.json`](./packs/index.json).\n\n## Language quality (and how it improves)\n\nMost packs start at `reviewStatus: \"starter\"`. That’s intentional: we’d rather ship useful starter packs quickly, then improve them through native-speaker review.\n\nIf you care about linguistic accuracy or preferred terminology for a specific community, open a PR — see [`CONTRIBUTING.md`](./CONTRIBUTING.md).\n\n## Roadmap (what’s next)\n\nWe track roadmaps in [`packs/ROADMAP.md`](./packs/ROADMAP.md) (version plan: patch / minor / major) and [`packs/languages-roadmap.json`](./packs/languages-roadmap.json) (machine-readable). Layer ceilings: [`packs/TIERS.md`](./packs/TIERS.md).\n\n\u003c!-- roadmap-bullets:start --\u003e\n- **Planned African languages** (by region + priority) — 40 more packs on the list\n- **Planned programming targets** — Clojure, Lua, SQL, Scala, Elixir (see [`packs/ROADMAP.md`](./packs/ROADMAP.md))\n- **Logical tokens** — **370 shipped**; stdlib / builtins tier → **2.0.0** (design-first; not required for beginner keyword transpilation)\n- **Programming targets** — **15 shipped** with 0 keyword coverage gaps (see table above)\n\u003c!-- roadmap-bullets:end --\u003e\n\nRegional focus (how we’re sequencing the work):\n\n- **Phase 1 — West Africa + Central Africa**: highest immediate demand and strong community contributor base\n- **Phase 2 — East Africa + Horn of Africa**: expand coverage where multilingual education is already strong\n- **Phase 3 — North Africa + Southern Africa + Indian Ocean**: fill remaining gaps and add country-specific variants where needed\n\nHigh-priority upcoming packs currently include:\n\n\u003c!-- upcoming-packs:start --\u003e\n_See [`packs/languages-roadmap.json`](./packs/languages-roadmap.json) for the full planned list._\n\u003c!-- upcoming-packs:end --\u003e\n\n## Contributing\n\nContributions are welcome—especially from native speakers and educators.\n\n### No coding required\n\n**Start here if you do not use git or JSON:** [`CONTRIBUTING-SIMPLE.md`](./CONTRIBUTING-SIMPLE.md)\n\n- [Suggest a translation](https://github.com/KolanutTechnologies/kola-language-packs/issues/new?template=translation-suggestion.yml) (add or improve a word)\n- [Report unnatural phrasing](https://github.com/KolanutTechnologies/kola-language-packs/issues/new?template=unnatural-phrasing.yml)\n\nMaintainers apply your suggestion and credit you in the pack.\n\n### Open a pull request (developers)\n\n**Start here:** [`CONTRIBUTING.md`](./CONTRIBUTING.md) — step-by-step guide (what to edit, what not to touch, checklist before you open a PR).\n\n**New language?** [`packs/NAMING_GUIDE.md`](./packs/NAMING_GUIDE.md) · [`packs/language-registry.json`](./packs/language-registry.json) · [`packs/DIALECTS.md`](./packs/DIALECTS.md) (dialects)\n\n**Also read:** [`packs/PACK_SCOPE.md`](./packs/PACK_SCOPE.md) · [`packs/GLOSSARY.md`](./packs/GLOSSARY.md) (what ISO / BCP-47 mean)\n\n### What you edit (and what you don’t)\n\n| File | Your role |\n|------|-----------|\n| `packs/\u003clanguage\u003e/pack.json` | **Edit** — metadata (`locale`, `countries`, `regions`, `scopeNote`) + keyword mappings |\n| `packs/\u003clanguage\u003e/keywords.json` | **Edit** — same keyword mappings (must match `pack.json`) |\n| `packs/logical-tokens.json` | **Read only** — checklist of all 370 concepts; do not edit for translations |\n| `packs/index.json` | **Edit only when adding a new pack** |\n| [`packs/language-registry.json`](./packs/language-registry.json) | **Check before naming** — shipped + planned identifiers |\n| [`packs/NAMING_GUIDE.md`](./packs/NAMING_GUIDE.md) | **Read for new packs** — full field list, locale format, template |\n\nA valid contribution is a **complete pack** (correct scope metadata + all 370 tokens translated), not a few word changes in isolation.\n\n### Contribute with a pull request\n\n1. **Improve an existing pack** — e.g. `packs/zulu/` — fix phrasing, add dialect aliases, clarify `scopeNote`\n2. **Add a new pack** — copy an existing pack, set all metadata, translate all 370 tokens, add to `packs/index.json`, run `npm run registry`\n\nOne language pack per PR. Run `npm test` from the **repo root** before opening the PR.\n\n**Windows (PowerShell):**\n```powershell\ngit clone https://github.com/KolanutTechnologies/kola-language-packs.git\ncd kola-language-packs\nnpm install\nnpm test\n```\n\n**Mac / Linux:**\n```bash\ngit clone https://github.com/KolanutTechnologies/kola-language-packs.git\ncd kola-language-packs\nnpm install\nnpm test\n```\n\n**Do not run** `npm run bootstrap` — it overwrites all packs ([`scripts/README.md`](./scripts/README.md)).\n\nDocs: [`CONTRIBUTING-SIMPLE.md`](./CONTRIBUTING-SIMPLE.md) (no coding) · [`CONTRIBUTING.md`](./CONTRIBUTING.md) · [`packs/REPO_MAP.md`](./packs/REPO_MAP.md) (what each file does) · [`VERSIONING.md`](./VERSIONING.md) · [`CHANGELOG.md`](./CHANGELOG.md)\n\n### Contribution flow (quick)\n\n1. Pick the right pack (or create a new variant) — see `packs/index.json` and `PACK_SCOPE.md`\n2. Edit `pack.json` metadata and translations; keep `keywords.json` in sync\n3. Map every token listed in `packs/logical-tokens.json` (370 total)\n4. Run `npm test`\n5. Open a PR for native-speaker review\n\n## Contributors\n\nThis project only works if real people show up with real language knowledge. Thank you to everyone who’s contributed time, expertise, and care.\n\n[![Contributors](https://contrib.rocks/image?repo=KolanutTechnologies/kola-language-packs)](https://github.com/KolanutTechnologies/kola-language-packs/graphs/contributors)\n\n## FAQ\n\nAnswers to recurring questions. This section lives in **README.md** only — it is **not** a folder or auto-generated file.\n\n**Who adds FAQ entries?** Maintainers, when the same question appears in GitHub issues, PRs, or discussions. **Suggest one:** open an issue with tag `question`.\n\n**Where do answers come from?** Project scope decisions already documented in `packs/` (logical tokens, pack schema, validation rules) — summarized here in plain language.\n\n### Is `packs/logical-tokens.json` exhaustive?\n\n\u003c!-- faq-target-count:start --\u003e\nIt's exhaustive for **this project's current scope**: a shared registry of **logical concepts** needed to map official reserved keywords across **15 programming targets** (plus a small set of \"structural\" concepts).\n\u003c!-- faq-target-count:end --\u003e\n\nIt is **not** a full programming-language grammar. It intentionally does **not** try to model:\n\n- punctuation (`;`, `{}`, `()`)\n- operators (`+`, `==`, `??`, `:=`)\n- comment syntax (`//`, `#`, `/* */`)\n- every syntax feature that isn’t keyword-driven\n\nIf we expand into full syntax coverage later, that would likely be a separate registry rather than inflating “logical tokens” beyond readability.\n\n### How do I contribute a dialect?\n\nUsually **edit the existing pack** and add aliases — not a new folder.\n\nExample (Swahili, East Africa): `\"IF\": [\"kama\", \"ikiwa\", \"if\"]` in `packs/swahili/`.\n\nFull decision tree: [`packs/DIALECTS.md`](./packs/DIALECTS.md).\n\n### What are ISO 639, ISO 3166-1, and BCP-47? Are we “compliant”?\n\nInternational standards for **language codes**, **country codes**, and **locale tags**. We follow them so npm, editors, and locale APIs understand our packs — same codes used across the African language ecosystem and global tech.\n\nPlain English: [`packs/GLOSSARY.md`](./packs/GLOSSARY.md). There is no formal certification body for language packs; we are **standards-aligned**.\n\n### Which npm commands do I run?\n\nFrom the **repo root** only:\n\n- **`npm test`** — every PR (checks your files; does not delete anything)\n- **`npm run registry`** — only when adding a new pack\n- **Never `npm run bootstrap`** as a contributor — overwrites all packs\n\nDetails: [`CONTRIBUTING.md`](./CONTRIBUTING.md) · [`scripts/README.md`](./scripts/README.md)\n\n### Can one pack be version 0.1.2 while another stays 0.1.1?\n\n**Not today** — all packs share the npm package version on each release. See [`VERSIONING.md`](./VERSIONING.md).\n\n### What is `pack.schema.json`? What do all these files do?\n\n[`packs/REPO_MAP.md`](./packs/REPO_MAP.md) — plain map of every folder and file.\n\n## Maintainers (optional)\n\nThis section is only relevant if you’re maintaining the package or editing generated pack data.\n\n\u003cdetails\u003e\n\u003csummary\u003eMaintainer notes (publishing + regeneration)\u003c/summary\u003e\n\n- Publishing: push to `main` runs [`.github/workflows/release.yml`](./.github/workflows/release.yml) (tag + GitHub Release + npm via **Trusted Publisher OIDC**). Configure on npm: `KolanutTechnologies/kola-language-packs` / `release.yml`. Local fallback: `npm login` then `npm publish --access public`.\n- **README metrics:** counts, coverage tables, spec-source tables, and the regional pack list are **generated** — do not hand-edit inside `\u003c!-- …:start --\u003e` / `\u003c!-- …:end --\u003e` markers. Run `npm run readme:sync` (or `npm test`) and commit `README.md`. CI fails if README is stale after test.\n- Sync pack versions after a manual version bump: `npm run sync-versions`\n- Regenerate derived pack files after changing the source definitions:\n\n```bash\nnpm run bootstrap\n```\n\n\u003c/details\u003e\n\n## License\n\nApache 2.0 — see [LICENSE](./LICENSE).\n\nSome imported terminology may carry additional license terms (e.g. Mafoko/NOODL). Check source licenses before bulk import and cite them in your PR.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkolanuttechnologies%2Fkola-language-packs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkolanuttechnologies%2Fkola-language-packs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkolanuttechnologies%2Fkola-language-packs/lists"}