Satu artikel 19 bahasa: struktur file, prompt terjemahan, 5 jebakan nyata, cara POST sekaligus.
Dokumentasi resmi Anthropic dan OpenAI cuma dalam bahasa Inggris. Ini celah besar di ekosistem konten untuk developer AI secara global. how2claude lagi ngisi celah itu — tiap artikel keluar di 19 bahasa sekaligus: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th.
Nyewa orang gak realistis (20 terjemahan per artikel, ribuan dolar per buah). Biarin Claude yang ngerjain, marginal cost-nya nyaris nol — tapi nge-lempar "terjemahin ke Jepang" aja bakal dapet teks berasa mesin penerjemah dan suara penulisnya hilang. Yang berikut adalah alur lengkap buat ngelakuin ini bener: struktur file, cara nulis prompt terjemahan, di mana Claude pasti bakal jeblok, gimana POST 19 bahasa plus tweet per bahasa ke API dalam satu kali panggilan.
Dua hal yang beda jauh.
Terjemahan mindahin makna dari bahasa A ke B — kerjaan Google Translate. Baca "bener" tapi "datar".
Lokalisasi ngejaga register, ritme, dan level teknis penulis, nulis ulang pake "suara blog teknis" khas bahasa target. Hasil baca-nya kayak ditulis native speaker.
Nerjemahin buat Claude kerja 5 menit; lokalisasi butuh prompt yang nge-spell out:
Command /write-article how2claude nyimpen style requirement per bahasa:
| File bahasa | Style requirement |
|---|---|
ja.md |
Suara blog teknis, bahasa Jepang natural |
ko.md |
Suara blog teknis, bahasa Korea natural |
zh-TW.md |
Penggunaan Taiwan, aksara tradisional |
ar.md |
Arab Standar Modern (tulisan) |
id.md |
Bahasa Indonesia standar |
Keliatannya cuma satu baris. Tapi buat Claude itu kritis — tanpa itu, default-nya jadi "terjemahan buku teks".
Satu direktori per draft, 20 file:
docs/drafts/let-claude-translate-articles/
├── meta.json # title + summary buat semua 19 bahasa
├── zh.md # Mandarin (sumber, ditulis duluan)
├── en.md # Inggris (batch terjemahan pertama)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(14 lagi)
└── th.md
meta.json:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"title": {
"zh": "让 Claude 把一篇文章翻译成 19 种语言",
"en": "Letting Claude Translate One Article Into 19 Languages",
"id": "Membiarkan Claude Menerjemahkan Satu Artikel ke 19 Bahasa",
"...": "..."
},
"summary": {
"id": "Satu artikel 19 bahasa: struktur file, prompt terjemahan, 5 jebakan nyata, cara POST sekaligus.",
"...": "..."
}
}
Baris pertama tiap file .md adalah # judul, sisanya isi. Title gak diambil dari baris pertama md — diambil dari meta.json, jadi tiap bahasa punya title yang udah dipoles pendek, bukan kalimat pembuka artikel yang mungkin udah ngaret pas diterjemahin.
Dua alur yang salah:
Salah: terjemahan berantai. zh → en → ja → ko → ...
Masalahnya: ja based on en, ko based on ja — tiap lompatan bocor sedikit makna. Pas sampe th (Thailand), udah informasi keempat tangan.
Bener: terjemahan radial. Finalize zh → generate en / ja / ko / ar / id / ... semua langsung dari sumber.
Tiap bahasa keluar langsung dari original, tanpa titik antar.
Struktur prompt (dikemas di dalam /write-article):
Ini artikel blog teknis tentang X, sumber bahasa Mandarin:
[zh.md lengkap]
Terjemahin ke bahasa-bahasa berikut, dengan requirement per bahasa:
- ja.md: suara blog teknis, bahasa Jepang natural
- ko.md: suara blog teknis, bahasa Korea natural
- ar.md: Arab Standar Modern (tulisan)
...
Aturan:
1. Pertahanin register penulis yang direct, profesional, sedikit self-deprecating
2. Jangan terjemahin code block, command, nama API, URL
3. Judul, sub-judul, alur paragraf boleh direkomposisi
4. Keluarin title terpisah per bahasa — pendek, punya hook, bukan terjemahan harfiah
Terjemahin 18 bahasa paralel, satu sesi Claude selesai. Satu detail penting: lakukan di sesi yang sama / versi model yang sama — voice akan drift antar sesi dan antar generasi model.
X ngitung karakter CJK (Mandarin/Jepang/Korea) lebih ketat. Gue minta Claude generate tweet dengan constraint ini:
Pass pertama, tiga tweet Mandarin kelebihan (160, 164, 152). Claude nerjemahin tweet Inggris harfiah — tweet Inggris 260 karakter jadi Mandarin persis di batas.
Aturan: tweet Mandarin wajib ditulis ulang, bukan diterjemahin. Requirement: cap 140 karakter, wajib ada hook, kehilangan detail dikit boleh.
zh → zh-TW gampang bikin males: lempar ke converter simplified-ke-tradisional. Karakternya match, kosakatanya nggak:
| zh | zh-TW (salah) | zh-TW (bener) |
|---|---|---|
| 文件 | 文件 | 檔案 |
| 信息 | 信息 | 資訊 |
| 软件 | 軟件 | 軟體 |
| 视频 | 視頻 | 影片 |
Pas minta zh-TW ke Claude, sebutin dua-duanya: "penggunaan Taiwan, aksara tradisional". "Cuma tradisional" cuma dapet konversi karakter doang.
Arab dan Ibrani baca dari kanan ke kiri. Di Rails butuh <html dir="rtl"> dan varian rtl: Tailwind. Tapi terjemahan-nya sendiri juga ada jebakan:
unicode-bidi: isolate atau code-nya "kesedot" ke aliran RTL، ganti ,, ؟ ganti ?. Claude default-nya pake tanda baca Inggris; harus di-spell out2026) di dalam paragraf kanan-ke-kiri. Browser nangani ini, tapi Claude sering campur aduk pas nulis teks rawFrase kolokial original ("sekali libas", "kepleset", "jebok") Claude nerjemahin ke Jepang/Korea sebagai bentuk tulisan formal (「一気に実装」「落とし穴」「失敗」) — arti match, tone menguap.
Fix: spell out di prompt — "pertahanin suara blog teknis yang direct, sedikit self-deprecating, informal; jangan academize". Meskipun begitu, beberapa bahasa (Jerman, Rusia) bakal mendarat sedikit lebih "formal" dari sumber — bahasa itu sendiri punya bias register tulisan.
String dalam code ada dua ember — teks UI (diterjemahin) dan placeholder/nama variabel (nggak):
t("pricing.page_title") # jangan diterjemahin (i18n key)
"user_id" # jangan diterjemahin (nama variabel)
"Monthly subscription" # ditampilin sebagai contoh di teks → jangan diterjemahin
Buat apapun yang berdampingan dengan code, "jangan terjemahin" adalah default yang lebih aman. Yang beneran perlu diterjemahin adalah file locale i18n (config/locales/xx.yml), itu kerjaan beda.
/publish-article POST draft ke how2claude.com/api/articles:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"thread": true,
"title": { "zh": "...", "en": "...", "ja": "...", ... },
"summary": { "zh": "...", "en": "...", ... },
"content": { "zh": "<md>", "en": "<md>", ... },
"tweets": { "en": ["...", "..."], "zh": [...], ... }
}
Satu request ~300KB (19 bahasa × ~15KB). Server pecah ke tabel DB:
articles, title / summary / content adalah jsonb di-key per localex_queue_tweets, per locale + account, dispatch ke queue penjadwalanTweet cuma keluar ke locale yang punya akun X connected (sekarang en/zh/ja/ko/ar/id — 6). Bahasa tanpa akun kirim []. Cek akun:
Account.all.each { |a| puts "#{a.locale}: #{a.name}" }
# en: @how2claude
# zh: @howtoclaude
# ja: @how2claude_ja
# ko: @how2claude_ko
# ar: @how2claude_ar
# id: @how2claude_id
Membiarkan Claude menerjemahkan satu artikel ke 19 bahasa — checklist lengkap:
dir="rtl" + varian rtl: Tailwind di sisi Rails. Tanda baca campuran dan isolasi code block ditangani terpisah.Bottleneck sebenarnya bukan kualitas terjemahan — model kelas Claude 4 nerjemahin ke Jepang/Korea/Arab/Rusia dengan kualitas mendekati native. Bottleneck-nya adalah apakah lo mau naruh satu artikel di depan pembaca 19 bahasa sekaligus. Secara teknis 5 menit kelar. Dari sisi konten, butuh kemauan buat melayani 200x audiens sekaligus.