Free

Membiarkan Claude Menerjemahkan Satu Artikel ke 19 Bahasa

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.


Keputusan inti: terjemahan vs. lokalisasi

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:

  • Siapa pembaca targetnya (developer, tim teknis)
  • Register referensi ("bunyinya kayak blog mana")
  • Istilah yang wajib tetap di bahasa sumber (nama API, nama framework, command, URL)
  • Di mana rekomposisi diperbolehkan (pecah kalimat panjang, ganti metafora dengan yang dikenal pembaca native)

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".

Struktur file: 19 bahasa tinggal di satu direktori

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.

Alur: tulis zh, terus pancar ke 18 bahasa

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.

5 tempat beneran jeblok

1. Batas karakter tweet beda per bahasa

X ngitung karakter CJK (Mandarin/Jepang/Korea) lebih ketat. Gue minta Claude generate tweet dengan constraint ini:

  • Tweet Mandarin ≤ 140 karakter
  • Bahasa lain ≤ 280 karakter

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.

2. zh-TW bukan konversi karakter

zhzh-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.

3. Bahasa RTL (ar, he) bikin layout rusak

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:

  • Code block tetep dalam Inggris, tapi pas paragraf Arab ngebungkus code block, browser butuh unicode-bidi: isolate atau code-nya "kesedot" ke aliran RTL
  • Tanda baca campuran: Arab pake ، ganti ,, ؟ ganti ?. Claude default-nya pake tanda baca Inggris; harus di-spell out
  • Arah angka: Arab nulis digit kiri-ke-kanan (2026) di dalam paragraf kanan-ke-kiri. Browser nangani ini, tapi Claude sering campur aduk pas nulis teks raw

4. Claude default-nya "ngeratain" suara penulis

Frase 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.

5. Placeholder dan variabel gak diterjemahin

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.

Publishing: satu POST, 19 bahasa

/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:

  • tabel articles, title / summary / content adalah jsonb di-key per locale
  • tabel x_queue_tweets, per locale + account, dispatch ke queue penjadwalan

Tweet 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

Checklist

Membiarkan Claude menerjemahkan satu artikel ke 19 bahasa — checklist lengkap:

  1. Finalize zh (atau en) duluan, terus pancar 18 terjemahan lain dari sumber itu. Jangan berantai.
  2. Style requirement per bahasa masuk prompt. "Bahasa Jepang natural" kurang — bilang "suara blog teknis, bahasa Jepang natural".
  3. Title dan summary diterjemahin terpisah, jangan ambil dari paragraf pertama body. Semua 19 title/summary disentralisir di meta.json.
  4. List eksplisit apa yang gak diterjemahin: code block, command, nama API, URL, i18n key, nama variabel. Yang diterjemahin: teks penjelasan, metafora, struktur paragraf.
  5. Tweet wajib ditulis ulang, bukan diterjemahin. 140 karakter buat Mandarin, 280 buat sisanya. Terjemahan harfiah Inggris-ke-Mandarin selalu lewat batas.
  6. Buat zh-TW bilang "penggunaan Taiwan + aksara tradisional"; kalau nggak, cuma dapet konversi karakter doang dan kosakata tetep versi daratan.
  7. Bahasa RTL (ar, he) butuh dir="rtl" + varian rtl: Tailwind di sisi Rails. Tanda baca campuran dan isolasi code block ditangani terpisah.
  8. POST semua bahasa sekaligus — 19 content + 19 title/summary + tweet buat tiap akun connected, satu request ke backend.

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.