scripts/translate-readme/README.md
Translate README.md files to multiple languages using the Claude Agent SDK. Perfect for build scripts and CI/CD pipelines.
npm install readme-translator
# or
npm install -g readme-translator # for CLI usage
ANTHROPIC_API_KEY environment variable set (for API-based usage)CLAUDE_CODE_USE_BEDROCK=1 + AWS credentials)CLAUDE_CODE_USE_VERTEX=1 + GCP credentials)If you have Claude Code installed and logged in with your Pro/Max subscription, the SDK will automatically use that authentication.
# Basic usage
translate-readme README.md es fr de
# With options
translate-readme -v -o ./i18n --pattern docs.{lang}.md README.md es fr de ja zh
# List supported languages
translate-readme --list-languages
| Option | Description |
|---|---|
-o, --output <dir> | Output directory (default: same as source) |
-p, --pattern <pat> | Output filename pattern (default: README.{lang}.md) |
--no-preserve-code | Translate code blocks too (not recommended) |
-m, --model <model> | Claude model to use (default: sonnet) |
--max-budget <usd> | Maximum budget in USD |
--use-existing | Use existing translation file as a reference |
-v, --verbose | Show detailed progress |
-h, --help | Show help message |
--list-languages | List all supported language codes |
import { translateReadme } from "readme-translator";
const result = await translateReadme({
source: "./README.md",
languages: ["es", "fr", "de", "ja", "zh"],
verbose: true,
});
console.log(`Translated ${result.successful} files`);
console.log(`Total cost: $${result.totalCostUsd.toFixed(4)}`);
interface TranslationOptions {
/** Source README file path */
source: string;
/** Target language codes */
languages: string[];
/** Output directory (defaults to same directory as source) */
outputDir?: string;
/** Output filename pattern (use {lang} placeholder) */
pattern?: string; // default: "README.{lang}.md"
/** Preserve code blocks without translation */
preserveCode?: boolean; // default: true
/** Claude model to use */
model?: string; // default: "sonnet"
/** Maximum budget in USD */
maxBudgetUsd?: number;
/** Use existing translation file (if present) as a reference */
useExisting?: boolean;
/** Verbose output */
verbose?: boolean;
}
interface TranslationJobResult {
results: TranslationResult[];
totalCostUsd: number;
successful: number;
failed: number;
}
interface TranslationResult {
language: string;
outputPath: string;
success: boolean;
error?: string;
costUsd?: number;
}
{
"scripts": {
"translate": "translate-readme README.md es fr de ja zh",
"translate:all": "translate-readme -v -o ./i18n README.md es fr de it pt ja ko zh ru ar",
"prebuild": "npm run translate"
}
}
Note: CI/CD environments require an API key since Claude Code won't be authenticated there.
name: Translate README
on:
push:
branches: [main]
paths: [README.md]
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm install -g readme-translator
- name: Translate README
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
translate-readme -v -o ./i18n README.md es fr de ja zh
- name: Commit translations
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add i18n/
git diff --staged --quiet || git commit -m "chore: update README translations"
git push
// scripts/translate.ts
import { translateReadme } from "readme-translator";
async function main() {
const result = await translateReadme({
source: "./README.md",
languages: (process.env.TRANSLATE_LANGS || "es,fr,de").split(","),
outputDir: "./docs/i18n",
maxBudgetUsd: 5.0,
verbose: !process.env.CI,
});
if (result.failed > 0) {
console.error("Some translations failed");
process.exit(1);
}
}
main();
| Code | Language | Code | Language |
|---|---|---|---|
ar | Arabic | ko | Korean |
bg | Bulgarian | lt | Lithuanian |
cs | Czech | lv | Latvian |
da | Danish | nl | Dutch |
de | German | no | Norwegian |
el | Greek | pl | Polish |
es | Spanish | pt | Portuguese |
et | Estonian | pt-br | Brazilian Portuguese |
fi | Finnish | ro | Romanian |
fr | French | ru | Russian |
he | Hebrew | sk | Slovak |
hi | Hindi | sl | Slovenian |
hu | Hungarian | sv | Swedish |
id | Indonesian | th | Thai |
it | Italian | tr | Turkish |
ja | Japanese | uk | Ukrainian |
vi | Vietnamese | ||
zh | Chinese (Simplified) | ||
zh-tw | Chinese (Traditional) |
Preserve Code Blocks: Keep preserveCode: true (default) to avoid breaking code examples
Set Budget Limits: Use maxBudgetUsd to prevent runaway costs
Run on Releases Only: In CI/CD, trigger translations only on main branch or releases
Review Translations: Automated translations are good but not perfect - consider human review for critical docs
Cache Results: Don't re-translate unchanged content - check if README changed before running
Typical costs per language (varies by README length):
MIT