---
name: Translate i18n
slug: translate-i18n
category: AI Engineering
description: Translate i18n fills missing i18n translations in the viewer source JSON, using English and Chinese as source languages to auto-translate to Japanese, Korean, French, Arabic, German, and Russian via OpenRouter. Use it after adding or modifying UI strings in claude_tap/viewer_i18n.json.
github: "https://github.com/liaohch3/claude-tap/tree/main/.agents/skills/translate-i18n"
language: Python
stars: 3064
forks: 266
install: "npx degit https://github.com/liaohch3/claude-tap/tree/main/.agents/skills/translate-i18n ~/.claude/skills/translate-i18n"
installs_to: ~/.claude/skills/translate-i18n
source_path: .agents/skills/translate-i18n/SKILL.md
collection_size: 11
category_size: 2451
collection_url: "https://dirskills.com/collections/liaohch3/claude-tap"
added: 2026-08-17T07:09:17.993Z
last_synced: 2026-08-17T07:09:17.993Z
canonical_url: "https://dirskills.com/skills/translate-i18n"
---

# Translate i18n

Translate i18n fills missing i18n translations in the viewer source JSON, using English and Chinese as source languages to auto-translate to Japanese, Korean, French, Arabic, German, and Russian via OpenRouter. Use it after adding or modifying UI strings in claude_tap/viewer_i18n.json.

**Install:**

```bash
npx degit https://github.com/liaohch3/claude-tap/tree/main/.agents/skills/translate-i18n ~/.claude/skills/translate-i18n
```

## README

# Translate i18n

Automatically fill missing translations for the viewer's `claude_tap/viewer_i18n.json` source file. The script uses English and Chinese as source languages and translates to Japanese, Korean, French, Arabic, German, and Russian.

## Prerequisites

- `OPENROUTER_API_KEY` must be set in the environment (it is in the user's `.zshrc`)
- Default model: `google/gemini-2.5-flash`

## Workflow

### 1. Check what's missing (dry run)

Always preview first to confirm which keys need translation:

```bash
uv run python scripts/translate_i18n.py --dry-run
```

This parses `claude_tap/viewer_i18n.json`, finds keys present in both `en` and `zh-CN` but missing in other languages, and lists them without modifying the file.

### 2. Run the translation

```bash
uv run python scripts/translate_i18n.py
```

The script calls OpenRouter once per target language, then writes the translations back into `viewer_i18n.json` in-place.

### 3. Verify the result

After translation, run the formatter and tests to make sure nothing broke:

```bash
uv run python -m json.tool claude_tap/viewer_i18n.json >/dev/null
uv run pytest tests/test_translate_i18n.py -v
```

## Options

| Flag | Purpose |
|------|---------|
| `--dry-run` | Show missing keys only, no file changes |
| `--model MODEL` | Override the OpenRouter model (default: `google/gemini-2.5-flash`) |
| `--target {viewer,cli}` | Translation target preset (default: `viewer`) |
| `--file PATH` | Override target file path |
| `--object-name NAME` | Override the legacy JS/Python i18n object name |

## How it works

The script:
1. Loads the viewer i18n JSON source file
2. Validates that every language block is a string-to-string map
3. Identifies keys present in `en` + `zh-CN` but missing in target languages
4. Sends a structured prompt to OpenRouter with existing translations for consistency
5. Normalizes fullwidth punctuation for CJK languages (matching zh-CN style)
6. Inserts new entries after the existing keys in each target language

## Common scenarios

**Added a new UI string**: Add the key to both `en` and `zh-CN` blocks in `claude_tap/viewer_i18n.json`, then run this skill. The other 6 languages will be filled automatically.

**Changed an existing string**: The script only fills *missing* keys. To re-translate an existing key, first delete it from the target language blocks, then run the script.
