Write code in your own human language. This is an Agent Skill that lets
Claude, Codex, OpenCode, Grok, Cursor — any agent that reads the open SKILL.md standard — render a
programming language's keywords and standard-library names into 100+ human languages and scripts,
deterministically and reversibly.
The renderings are compiled from a signed, human-reviewed source of truth. They are not model guesses: the same input always gives the same output, and every localization reverses cleanly back to canonical code.
# canonical # → Thai # → Tamil
def add(a, b): def add(a, b): def add(a, b):
if a > b: ถ้า a > b: எனில் a > b:
return a คืนค่า a திருப்பு a
else: มิฉะนั้น: இல்லையெனில்:
return b คืนค่า b திருப்பு bYour strings, comments, and your own identifiers are never touched. add, a, b stay exactly as you
wrote them — only the language's vocabulary is localized.
The repo root is the skill, so installing is a clone into your agent's skills directory:
| Agent | Command |
|---|---|
| Claude Code | git clone https://github.com/nadalang/skill ~/.claude/skills/nada-localization |
| OpenCode | git clone https://github.com/nadalang/skill ~/.claude/skills/nada-localization |
| OpenAI Codex | git clone https://github.com/nadalang/skill ~/.agents/skills/nada-localization |
| Grok Build | git clone https://github.com/nadalang/skill ~/.grok/skills/nada-localization |
| Cursor / Copilot | git clone https://github.com/nadalang/skill ~/.claude/skills/nada-localization |
| Claude Desktop | Download this repo as a ZIP → Settings → Features → upload the skill |
For a single project instead of your whole machine, clone into .claude/skills/nada-localization
(or .agents/skills/…) inside the repo you're working in.
Update: cd <that folder> && git pull
The folder name matters — it must stay nada-localization to match the skill's declared name.
Once installed, just ask your agent in the normal way — "write me a bubble sort in Python, in Thai" — and it will call the skill instead of guessing the keywords.
To drive it directly (Python 3, standard library only — nothing to install):
# Localize a snippet
python nada.py localize --lang python --locale th --code "def f():
return 1"
# Reverse it back to canonical English
python nada.py canonicalize --lang python --locale th --code "def f():
คืนค่า ๑"
# Look up one term, with its gloss and abbreviation ladder
python nada.py term --lang javascript --canonical function --locale de
# → de: "Funktion"
# What's covered
python nada.py languages
python nada.py localesEvery command runs online (against the hosted API) or fully offline with no network at all — add
--db and point at a bundled pack:
python nada.py --db data/nada-sea.sqlite localize --lang python --locale th --code "def f(): return 1"Two packs ship here:
| Pack | Contents |
|---|---|
data/nada-sea.sqlite |
Southeast Asian locales — Thai, Vietnamese, Tamil, Khmer, Indonesian, Malay, Tagalog, Javanese, Sundanese, Lao, Cebuano, Burmese |
data/nada-demo.sqlite |
9 diverse locales across Latin, CJK, Arabic, and Devanagari |
A pack is a snapshot. NADA is early and the brain is re-cut often, so packs drift:
python nada.py --db data/nada-sea.sqlite check
# → CURRENT — this pack matches the live brain exactly.
# → STALE — the brain moved (1.1.0-alpha.8 → 1.1.0-alpha.10). Run `git pull`.Offline commands also print a one-line note to stderr (never stdout) once a pack is more than a couple of
days old. To refresh, git pull — new packs ship with the repo. Online mode is always current.
Want a pack for a specific set of languages/locales, or the raw dataset? The full brain is published at https://brain.nada.build (
/latest/index.json). Thebuild-pack.mjsslicer in this repo is an internal tool that expects the full brain snapshot, which is not bundled here — open an issue and we'll cut you the slice you need.
nada.py localize is lexical: it substitutes whole keyword tokens and skips strings and comments, but it
cannot tell a builtin named add from your function named add. It's excellent for reading, explaining,
and previewing. For production output that resolves scope and never touches user-defined names, use the NADA
core engine or the NADA IDE. When in doubt, localize keywords only — the default, and always safe.
Never invent a localized keyword. If a term isn't in NADA, keep the canonical English — don't translate it yourself. The whole point is that the rendering is authoritative and identical everywhere. A token invented at inference time is non-authoritative, non-reversible, and usually subtly wrong.
NADA is an open standard and commons for localized programming terminology — a non-profit project stewarded by Christopher Shelley and Rev Miller (a formal entity is pending). Every legitimate programming language and every human language is in scope, including minority and heritage forms in their own scripts.
- Standard + commons: https://nadalang.org
- API + products: https://nada.build
- Guidance for AI systems: https://nadalang.org/for-ai
- Code (
nada.py,build-pack.mjs): MIT — see LICENSE. - Language data (
data/*.sqlite): CC-BY-4.0. The language belongs to everyone; attribution is all we ask.