AI agent skill · by @Leanmcp
Translate Explanation
Translate existing code-explanation docs into another language, Chinese by default. Translates a whole `CODE_EXPLANATION/` folder into a parallel `CODE_EXPLANATION_<LANG>` copy (e.g. `CODE_EXPLANATION_ZH`), or a single file — either bilingually in place (English + translation interleaved) for small files or as a `<name>_<lang>.<ext>` sidecar copy for larger ones. Keeps filenames, code, identifiers, file paths, and technical terms in English — only the explanatory prose is translated. Use this skill whenever the user wants to translate, localize, or produce a non-English version of code-explanation / codebase documentation: phrases like "translate-explanation", "translate the code explanation", "translate the CODE_EXPLANATION folder", "localize these docs to Chinese", "make a Chinese version of the explanation", or naming any target language for the explanation files. Default to Chinese (ZH) when no language is specified.
Archived 2026-10-23 · Source updated 2026-10-07 · License: MIT. Check the original repository for the latest version.
SKILL.md instructions
# Translate Explanation
Translate generated code-explanation docs (the kind produced by the
`code-explanation` skill) into another language. The prose is translated but
everything technical stays in English so the docs remain accurate and usable by
engineers.
**Default language is Chinese (`ZH`).** If the user names another language, use
its code instead (see the table below).
## Translation modes
First decide what's being translated — a whole folder or a single file — because
the output shape differs.
**Folder mode (default).** The target is a `CODE_EXPLANATION/` folder (or any
folder of docs). Produce a parallel folder named `<FOLDER>_<LANG>` (e.g.
`CODE_EXPLANATION_ZH`) with the same files. See *Folder mode* below.
**Single-file mode.** The target is one file. Choose between two output styles
based on the file's length, because what's pleasant to read differs by size:
- **Bilingual / interleaved (small files, < 50 lines).** Update the file
in place so each prose line is immediately followed by its translation —
English line, then Chinese line. For short files this keeps original and
translation together and is easy to scan. See *Single-file mode → Bilingual*.
- **Sidecar file (larger files, ≥ 50 lines).** Don't clutter a long file with
interleaving. Instead create a fully-translated copy named
`<name>_<lang>.<ext>` (e.g. `notes_zh.md`) in the **same folder**, leaving the
original untouched. See *Single-file mode → Sidecar*.
Use the line count of the source file to pick the style; if the user explicitly
asks for one style, honor that regardless of size.
In every mode, the rules in *What to translate vs. keep as-is* apply.
## Folder mode
### 1. Locate the source folder
Find the explanation folder to translate. By default this is `CODE_EXPLANATION/`
at the repo root. If it isn't there, search for it
(`find . -type d -name 'CODE_EXPLANATION' -not -path '*/node_modules/*'`) and
confirm with the user if there are multiple candidates. List its files so you
know exactly what to translate — typically `OVERVIEW.md` and numbered files like
`01_architecture.md`, `02_models.md`, etc.
### 2. Resolve the target language and output folder
Map the requested language to a short uppercase code and create the output
folder `CODE_EXPLANATION_<CODE>` as a sibling of the source folder.
| Language | Code | Output folder |
|-----------|------|----------------------------|
| Chinese | `ZH` | `CODE_EXPLANATION_ZH` |
| Spanish | `ES` | `CODE_EXPLANATION_ES` |
| French | `FR` | `CODE_EXPLANATION_FR` |
| German | `DE` | `CODE_EXPLANATION_DE` |
| Japanese | `JA` | `CODE_EXPLANATION_JA` |
| Korean | `KO` | `CODE_EXPLANATION_KO` |
| Hindi | `HI` | `CODE_EXPLANATION_HI` |
| Portuguese| `PT` | `CODE_EXPLANATION_PT` |
If no language is given, **default to Chinese (`ZH`)**. For a language not in the
table, use its common two-letter ISO 639-1 code, uppercased.
### 3. Translate each file, one by one
For every file in the source folder, create a file with the **exact same name**
in the output folder. Filenames never change — `01_architecture.md` stays
`01_architecture.md`, not `01_架构.md`. This keeps the two folders aligned
side by side so a reader can compare them file-for-file.
Translate the **prose** into the target language while keeping everything
technical in English. Read each source file, translate its content, and write
the result. Don't translate by guesswork from filenames — translate the actual
content.
## Single-file mode
When the target is a single file (not a folder), first count its lines to choose
the output style, then resolve the language code (Chinese/`ZH` by default).
### Bilingual / interleaved (small files, < 50 lines)
Edit the file **in place**. After each translatable prose line, insert its
translation on the next line, so the file alternates English then the target
language. This keeps a short file readable as a single bilingual document.
- Leave **code blocks verbatim and unduplicated** — never interleave inside a
fenced block; just keep it once.
- For a heading, put the original heading, then the translated heading on the
next line (both as headings).
- Blank lines and structure stay intact.
Example (English file → bilingual):
```markdown
# Architecture
# 架构
The handler authenticates the caller, then renders a response.
该 handler 会对调用方进行认证,然后渲染出一个 response。
```
### Sidecar file (larger files, ≥ 50 lines)
Don't interleave a long file — it becomes hard to read. Instead create a new
file in the **same folder** named `<name>_<lang>.<ext>`: take the original
filename, insert `_<lang>` before the extension (lowercase code), e.g.
`design.md` → `design_zh.md`, `README.txt` → `README_zh.txt`. Write a complete
translation there following the standard rules, and leave the original file
unchanged.
## What to translate vs. keep as-is
The guiding idea: an engineer reading the translated docs should see their own
language for the *explanations*, but the exact same code and terminology they'd
find in the editor. Translating an identifier or a library name would make the
docs wrong and unsearchable, so leave those untouched.
**Translate** (the prose):
- Sentences and paragraphs that explain things.
- The descriptive part of headings — but keep technical nouns in English.
Example: `## Data models and validation` → `## 数据模型与 validation`
(translate the connective prose, keep `validation` as the technical term).
- Table cells that contain descriptions/explanations.
**Keep exactly as-is (do NOT translate):**
- **Filenames** — same name in the output folder.
- **Fenced code blocks** (```` ```…``` ````) — copy verbatim, including any code
comments. Code is code.
- **Inline code** in backticks — `RequestHandler`, `pip install treecap`,
`src/server/handler.py`.
- **Identifiers and symbols** — class/function/variable names, module paths,
file paths, line references like `handler.py:42`.
- **Library, framework, tool, and product names** — `FastAPI`, `Pydantic`,
`React`, `PostgreSQL`, `treecap`.
- **Established technical terms** — keep them in English inline within the
translated sentence (e.g. dependency injection, middleware, registry pattern,
endpoint, schema, async). These are the shared vocabulary engineers use
regardless of spoken language; translating them adds confusion, not clarity.
- **URLs, commands, and config snippets.**
### Example (English → Chinese)
Source (`01_architecture.md`):
````markdown
The central request handler lives in `src/server/handler.py`. Every inbound
request flows through `handle()`: it authenticates the caller, loads the
relevant record, and renders a response. Note the dependency injection in
`__init__` — `Store` and `AuthService` are passed in rather than constructed
here, which makes the handler unit-testable.
```python
async def handle(self, req: Request) -> Response:
user = await self.auth.verify(req.token)
return self._render(record, user)
```
````
Translated (`01_architecture.md` inside `CODE_EXPLANATION_ZH/`):
````markdown
核心的 request handler 位于 `src/server/handler.py`。每个进入的请求都会经过
`handle()`:它会对调用方进行认证,加载相关的 record,然后渲染出 response。注意
`__init__` 中使用了 dependency injection —— `Store` 和 `AuthService` 是被传入的,
而不是在这里构造的,这使得该 handler 可以进行单元测试。
```python
async def handle(self, req: Request) -> Response:
user = await self.auth.verify(req.token)
return self._render(record, user)
```
````
Notice: the code block is byte-for-byte identical, all backticked identifiers
stay English, technical terms (`handler`, `dependency injection`, `record`,
`response`) stay English inline, and only the connective prose is translated.
## Quick checklist
- [ ] Determined the mode: whole folder, or a single file
- [ ] Resolved target language code (Chinese/`ZH` by default)
- [ ] **Folder mode:** created `<FOLDER>_<CODE>/` sibling, one output file per source file with **identical filenames**
- [ ] **Single file < 50 lines:** edited in place, bilingual (English line then translation line), code blocks kept once
- [ ] **Single file ≥ 50 lines:** wrote a `<name>_<lang>.<ext>` sidecar in the same folder, original untouched
- [ ] Prose translated; code blocks, identifiers, paths, and tool/library names verbatim
- [ ] Technical terms kept in English inline within translated sentences