Languages
itda speaks twelve languages where a person reads it: the lines itda setup
and its friends print, the landing page and the README. English is the
source. Korean was edited by hand and is kept as it is. The other ten are
translated from English with the glossary below.
| Tag | Language | CLI | Landing | README |
|---|---|---|---|---|
en | English | apps/cli/text/en.json | site/index.html itself | README.md |
ko | 한국어 | apps/cli/text/ko.json | site/i18n/ko.js | README.ko.md |
ja | 日本語 | apps/cli/text/ja.json | site/i18n/ja.js | README.ja.md |
zh-Hans | 简体中文 | apps/cli/text/zh-Hans.json | site/i18n/zh-Hans.js | README.zh-Hans.md |
zh-Hant | 繁體中文 | apps/cli/text/zh-Hant.json | site/i18n/zh-Hant.js | README.zh-Hant.md |
es | Español | apps/cli/text/es.json | site/i18n/es.js | README.es.md |
fr | Français | apps/cli/text/fr.json | site/i18n/fr.js | README.fr.md |
de | Deutsch | apps/cli/text/de.json | site/i18n/de.js | README.de.md |
pt-BR | Português (Brasil) | apps/cli/text/pt-BR.json | site/i18n/pt-BR.js | README.pt-BR.md |
vi | Tiếng Việt | apps/cli/text/vi.json | site/i18n/vi.js | README.vi.md |
id | Bahasa Indonesia | apps/cli/text/id.json | site/i18n/id.js | README.id.md |
ru | Русский | apps/cli/text/ru.json | site/i18n/ru.js | README.ru.md |
What is translated, and what is not
What a person reads. Everything an agent acts on stays English, on purpose, so that a definition, an error or a tool behaves the same in every conversation. Translated:
- the lines the CLI prints during
itda setup,itda login,itda refresh,itda fsckand the first bareitda, all throughapps/cli/src/text.rs; - what
itda describe <site>anditda ls --jsonsay a person can do with a site (user_guide) and the example prompts (natural_prompts), from one table of phrases incrates/prep/src/guide.rs;itda_sitesgives them to agents in English; - the action descriptions
itda setupanditda draftwrite, from one table of phrases incrates/prep/src/label.rs(List what {title} shows,Search on {title}). The language is the one the person set, else the page’s own<html lang>, else English. The site’s own words (titles, field and operation names) stay as the site wrote them, and so does the kind of record (news articles) outside Korean. Agents read every one of these languages, so a description in Japanese works as well as one in English; what an agent acts on (tool names, error codes, remedies) stays English; - the landing page and its title and description;
- the README.
Not translated:
- MCP tool descriptions, error codes and their
remedylines, the keys of the JSON envelope. Agents read them. - Site definitions apart from the drafted
desc: the ready-made ones and the reviewed ones inexamples/are English originals, and nothing translates a definition once it is written. - The handbook under
docs/(this file included).docs/SPEC.mdalone is 41 KB and changes with every minor release; a translation would be wrong within weeks. The README carries what a newcomer needs in every language. og:titleandog:descriptionon the landing page. Crawlers do not run scripts, so they see English.
How the language is chosen
The CLI reads ITDA_LANG, then the system LANG, and takes the first
language it supports. The tag may be BCP 47 (ja, zh-TW, pt-BR) or a POSIX
locale (ja_JP.UTF-8, zh_TW.Big5, C). Encoding and modifier are dropped,
_ reads as -, case does not matter. Then:
| Tag | Language |
|---|---|
zh-TW, zh-HK, zh-MO, zh-Hant* | zh-Hant |
any other zh* (zh, zh-CN, zh-SG, zh-Hans*) | zh-Hans |
any pt* | pt-BR |
in (the old code for Indonesian) | id |
C, POSIX, empty | en |
| anything else | its first subtag when that is a language above, else en |
ITDA_LANG=ja itda speaks Japanese whatever the system says. A key that a
language file lacks falls back to English.
The landing page picks ?lang= from the address, then the last choice on
that device (localStorage), then the first entry of navigator.languages
that maps to a language above, with the same rules. The picker in the header
changes it and remembers it. <html lang>, the title and the description
change with it.
Glossary
Each language uses these words for these things, in the CLI, on the landing page and in the README alike. A translation that needs another word for one of them changes this table in the same pull request.
| English | ko | ja | zh-Hans | zh-Hant | es | fr | de | pt-BR | vi | id | ru |
|---|---|---|---|---|---|---|---|---|---|---|---|
| site | 사이트 | サイト | 站点 | 網站 | sitio | site | Site | site | trang web | situs | сайт |
| action | 액션 | アクション | 操作 | 操作 | acción | action | Aktion | ação | hành động | aksi | действие |
| read (noun) | 읽기 | 読み取り | 读取 | 讀取 | lectura | lecture | Lesevorgang | leitura | lượt đọc | pembacaan | чтение |
| change (noun, an action that writes) | 변경 | 変更 | 更改 | 變更 | cambio | modification | Änderung | alteração | thay đổi | perubahan | изменение |
| approval / approve | 승인 / 허락 | 承認 / 承認する | 批准 / 批准 | 核准 / 核准 | aprobación / aprobar | approbation / approuver | Freigabe / freigeben | aprovação / aprovar | phê duyệt | persetujuan / menyetujui | подтверждение / подтвердить |
setup (itda setup) | 설정, 세팅 | セットアップ | 设置 | 設定 | configuración | configuration | Einrichtung | configuração | thiết lập | penyiapan | настройка |
| agent | 에이전트 | エージェント | 代理 | 代理 | agente | agent | Agent | agente | agent | agen | агент |
| definition (a site definition) | 정의 | 定義 | 定义 | 定義 | definición | définition | Definition | definição | định nghĩa | definisi | определение |
| sign in / sign-in | 로그인 | サインイン | 登录 | 登入 | iniciar sesión / inicio de sesión | se connecter / connexion | anmelden / Anmeldung | entrar / login | đăng nhập | masuk | войти / вход |
| record / recording | 녹화 | 記録 | 录制 | 錄製 | grabar / grabación | enregistrer / enregistrement | aufzeichnen / Aufzeichnung | gravar / gravação | ghi lại / bản ghi | merekam / rekaman | записать / запись |
| draft (noun and verb) | 초안 | 下書き | 草稿 | 草稿 | borrador | brouillon | Entwurf | rascunho | bản nháp | draf | черновик |
check (itda check) | 점검 | 点検 | 检查 | 檢查 | comprobación | vérification | Prüfung | verificação | kiểm tra | pemeriksaan | проверка |
refresh (itda refresh, draft again) | 다시 초안 | 再作成 | 重新起草 | 重新起草 | volver a redactar | nouveau brouillon | neu entwerfen | rascunhar de novo | soạn lại | menyusun ulang | составить заново |
| keyring | 키링 | キーリング | 密钥环 | 鑰匙圈 | llavero | trousseau | Schlüsselbund | chaveiro | keyring | keyring | связка ключей |
Product and command names stay as they are: itda, Claude Desktop, Claude
Code, Cursor, VS Code, Codex, GitHub, MCP, and every itda ... command,
flag, exit code, verdict (ok, signed_out, site_changed, blocked,
unreachable) and error code.
Rules for a translation
- A
{field}in a CLI string is filled in by the code. Every translation keeps the same set of fields as English, in whatever order its grammar wants. A test checks that. - A landing string keeps every HTML tag and attribute, every
<code>and link exactly. Only the words change. - Numbers, commands, code blocks, file names, addresses and the console transcript’s prompt line are not translated.
- The example hosts (
the-site-you-use.example,intranet.example) stay exactly as they are in every language. They are reserved example domains inside commands people copy, not prose. The transcript’s output lines are what the binary prints in that language: they come from the CLI strings. - The README keeps the English section order, the same headings count, the same links and the same images. Its first lines carry the same language line as every other README, with its own language in bold.
- Plain words, in the voice of the English text. No slogans.
Add a language
- Copy
apps/cli/text/en.jsontoapps/cli/text/<tag>.jsonand translate the values. Add the tag toLANGUAGESincrates/types/src/lang.rs, toSUPPORTEDinapps/cli/src/text.rsand the file to theinclude_str!list next to it, and toLANGSinapps/cli/tests/i18n.rs. Add a column toTEMPLATESincrates/prep/src/label.rsand incrates/prep/src/guide.rs.cargo test -p itda-cliandcargo test -p itda-prepcheck the keys and fields. - Copy
site/i18n/ko.jstosite/i18n/<tag>.js, change the tag inwindow.ITDA_I18N["<tag>"]and translate the values. Add the tag and its name in its own language to the<select data-lang-switch>insite/index.htmland toLANGSinsite/main.js. Dropflow.srcunless the diagram was redrawn in that language (python3 assets/src/flow.py). - Translate
README.mdtoREADME.<tag>.mdand add the language to the language line of every README. - Add the row to the tables above and a line to
CHANGELOG.md.
Checks
cargo test -p itda-cli text::: every language has every key ofen.jsonand no other; every key has the same{fields}in every language; locale tags resolve as the table says; the strings and the description phrases cover the same languages.cargo test -p itda-prep label::andguide::: every description, guide and prompt phrase exists in every language, with the same{fields}as English.cargo test -p itda-cli --test i18n: everysite/i18n/<tag>.jshas the keys ofindex.htmland the same HTML tags and links per key, and links to a heading its README has; every README has the headings, code blocks and links ofREADME.mdand the same language line; the picker lists every language.- A pull request that changes
README.md,site/index.htmlorapps/cli/text/en.jsonchanges the eleven other languages in the same pull request, or says in its description what it leaves for later.