Machine translation (MT) adalah terjemahan oleh mesin lewat API: kirim teks Indonesia, dapat teks Jepang dalam hitungan detik. Bayangin penerjemah kilat yang belum pernah ke Dieng. Dia bisa menyelesaikan kamus kartu pesan dalam tiga bahasa sebelum teh Bu Sri dingin, tapi dia gak tahu bahwa "Kamar Teras" adalah nama kamar, gak tahu {{name}} itu slot yang gak boleh disentuh, dan gak tahu bahasa Arab butuh enam bentuk jamak. Jadi hasil MT adalah draf: dilindungi sebelum dikirim, dicek sesudah kembali, lalu dibaca manusia (post-editing) sebelum sampai ke tamu.
🧪 Tebakan cepat: Bu Sri mengirim
"Terima kasih, {{name}}!"ke DeepL apa adanya. Apakah DeepL otomatis mengenali{{name}}sebagai placeholder dan membiarkannya? Jawabannya ada di bagian "Lindungi slot sebelum dikirim".
Tiga jalan: DeepL, Google, dan LLM
Harga per 11 Oktober 2026, dari halaman harga masing-masing:
| Penyedia | Endpoint | Yang ditagih | Harga |
|---|---|---|---|
| DeepL API | POST https://api.deepl.com/v2/translate |
karakter teks sumber (per code point); tag XML/HTML dan context gak dihitung |
Developer: gratis, kredit 1 juta karakter sekali. Growth: $32,50 per bulan termasuk 1 juta karakter, lebihnya $27,50 per 1 juta. API Free dan API Pro lama gak dijual lagi |
| Google Cloud Translation (NMT) | POST https://translation.googleapis.com/v3/projects/PROJECT_ID/locations/us-central1:translateText |
semua karakter yang dikirim, per bahasa tujuan, termasuk markup dan spasi | 500.000 karakter pertama per bulan gratis, lalu $20 per 1 juta. Mode Translation LLM: $10 per 1 juta input + $10 per 1 juta output |
LLM: asisten dari jalur AI (OpenAI Responses API, gpt-6-luna) |
POST https://api.openai.com/v1/responses |
token input dan output (usage) |
$0,10 per 1 juta token input, $0,50 per 1 juta token output |
Kamus id-ID kartu kami: 10 key, 229 karakter. Ke tiga bahasa, lewat DeepL dengan slot dilindungi: 3 × 169 = 507 karakter ditagih, sekitar $0,014 di harga lebih Growth. Kecil sekali; yang mahal adalah memperbaiki terjemahan buruk yang sudah tayang.
Lindungi slot sebelum dikirim
Jawaban tebakannya: gak. Dokumentasi DeepL sendiri menulis API-nya gak mengenali tag Mustache ({{...}}) dan gak punya parameter untuk mengecualikannya. Caranya: ganti tiap slot dengan tag yang dikenali mesinnya, terjemahkan, kembalikan, lalu cek lagi.
// Slot {{...}} jadi tag XML kosong untuk DeepL (tag_handling: 'xml').
function protect(text) {
const slots = [];
const out = text.replace(/\{\{[^{}]+\}\}/g, (slot) => `<x i="${slots.push(slot) - 1}"/>`);
return { out, slots };
}
function restore(text, slots) {
return text.replace(/<x i="(\d+)"\/>/g, (tag, i) => slots[Number(i)] ?? tag);
}
const { out, slots } = protect('Total {{count}} malam: {{price}}');
// out: 'Total <x i="0"/> malam: <x i="1"/>'
// Contoh balasan (stand-in, bukan panggilan API): '<x i="0"/>泊の合計:<x i="1"/>'
restore('<x i="0"/>泊の合計:<x i="1"/>', slots); // '{{count}}泊の合計:{{price}}'
- DeepL: kirim dengan
tag_handling: 'xml'. Tag-nya gak ditagih, jadi yang ditagih turun dari 229 ke 169 karakter. - Google: kirim
mimeType: 'text/html'dan bungkus slot dengan<span translate="no">{{price}}</span>. Isinya gak diterjemahkan, tapi tetap ditagih, markup-nya juga: 425 karakter per bahasa. - LLM: tulis aturannya di
instructions("jangan ubah{{...}}") dan minta keluaran JSON dengan key yang sama (text.formatdenganjson_schema, seperti di jalur AI). - Apa pun mesinnya, jalankan cek dari pelajaran sebelumnya (sintaks dan placeholder) pada hasilnya. Tag bisa pindah posisi (urutan kata Jepang beda), itu wajar; yang gak boleh adalah tag hilang atau bertambah.
Glosarium: nama tetap nama
Glosarium adalah daftar istilah dengan terjemahan yang dikunci. Ada dua jenis entri: yang gak diterjemahkan ("Homestay Kabut", "Dieng") dan yang terjemahannya tetap ("Kamar Teras" selalu "テラスルーム", "غرفة التراس", "Terrace Room", sama seperti kamus kita).
// DeepL: buat sekali (POST /v3/glossaries), lalu pakai glossary_id di tiap request.
{
"name": "homestay-kabut",
"dictionaries": [
{ "source_lang": "id", "target_lang": "ja", "entries": "Kamar Teras\tテラスルーム\nHomestay Kabut\tHomestay Kabut", "entries_format": "tsv" }
]
}
- DeepL mendukung glosarium untuk ID, JA, AR, dan EN;
glossary_idmewajibkansource_lang. Parametercontext(gak ditagih) memberi keterangan kalimatnya, misalnya "teks tombol di kartu pesan kamar". - Google: glosarium harus ada di lokasi
us-central1, dipakai lewatglossaryConfig, dan hasilnya ada diglossaryTranslations. - LLM: tulis glosarium di
instructions, lalu cek hasilnya dengan kode. Instruksi bukan jaminan.
Request dan response, tanpa panggilan berbayar
// Di server, bukan di browser: API key gak boleh sampai ke tamu.
const res = await fetch('https://api.deepl.com/v2/translate', {
method: 'POST',
headers: { Authorization: `DeepL-Auth-Key ${process.env.DEEPL_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
text: ['Total <x i="0"/> malam: <x i="1"/>', 'Terima kasih, <x i="0"/>!'],
source_lang: 'ID',
target_lang: 'JA',
tag_handling: 'xml',
glossary_id: 'GLOSSARY_ID',
context: 'Kartu pesan kamar Homestay Kabut di Dieng.',
show_billed_characters: true,
}),
});
const { translations } = await res.json();
// [{ detected_source_language: 'ID', text: '...', billed_characters: 14 }, ...]
// 14 = "Total " + " malam: ": tag <x/> gak dihitung
Bentuk request dan response di atas diambil dari dokumentasi DeepL. Kami gak memanggil API berbayar, jadi teks hasil di pelajaran dan Lab ini adalah stand-in yang ditulis tangan.
Kualitas: id ke ja dan id ke ar, jujur saja
MT sering salah di tiga tempat: konteks (teks UI pendek gak punya kalimat di sekitarnya), idiom, dan konsistensi istilah (hari ini "Terrace Room", besok "Veranda Room"). Karena itu hasil MT selalu lewat post-editing sebelum production. Pasangan Indonesia ke Jepang dan Indonesia ke Arab punya masalah khusus:
- Jamak: sumber Indonesia cuma punya satu bentuk (
nights). MT mengembalikan satu kalimat, padahalar-EGbutuh enam (zero,one,two,few,many,other) danen-USdua. Bentuk yang kurang ditulis manusia. - Kesopanan Jepang: DeepL punya
formalityuntuk JA; tetap cek apakah nadanya cocok untuk tamu. - Gender dan arah tulisan Arab: "terima kasih" untuk tamu laki-laki dan perempuan bisa beda (لكَ, لكِ); hasilnya juga dicek dalam tampilan RTL.
- Kami gak punya skor kualitas yang bisa dipercaya untuk dua pasangan ini, dan gak akan mengarangnya. Ukur sendiri: berapa persen string MT yang diubah penerjemah saat post-editing.
Post-editing, tandai MT, dan cache
import { createHash } from 'node:crypto';
const cache = new Map(); // di production: tabel database atau KV
function cacheKey(engine, target, glossaryVersion, text) {
return createHash('sha256').update([engine, target, glossaryVersion, text].join('\n')).digest('hex');
}
// Tiap hasil disimpan dengan statusnya:
// { text: '{{count}}泊の合計:{{price}}', source: 'mt', engine: 'deepl', reviewed: false }
- Tandai tiap string hasil MT (
source: 'mt',reviewed: false). Di TMS, MT dipakai sebagai pre-translation yang belum di-approve, danexport_only_approved: truedicrowdin/github-actioncuma mengunduh yang sudah disetujui. - Cache dengan key dari mesin, bahasa tujuan, versi glosarium, dan teks sumber. Teks yang gak berubah gak diterjemahkan ulang: hemat biaya, dan terjemahan yang sudah direview gak tertimpa versi model yang lebih baru.
- Teks sumber berubah = key cache berubah = draf baru dengan
reviewed: falselagi.
⚠️ Jebakan yang sering ketemu
- Mengirim slot apa adanya.
{{name}}bisa ikut diterjemahkan jadi{{名前}}atau{{الاسم}}, dan kartunya menulis slot mentah. Lindungi, lalu cek. - Menganggap MT sudah final. Langsung tayang tanpa post-editing berarti istilah berubah-ubah dan bentuk jamak Arab kurang.
- API key di browser. Panggil MT dari server atau dari CI, bukan dari halaman tamu.
- Menerjemahkan ulang semuanya tiap build. Biaya naik, dan terjemahan yang sudah dibetulkan manusia tertimpa. Pakai cache dan status
reviewed.
TL;DR: MT (DeepL, Google Cloud Translation, atau LLM seperti gpt-6-luna lewat Responses API) memberi draf cepat, bukan terjemahan final. Harga per 11 Oktober 2026: DeepL Growth $32,50 per bulan termasuk 1 juta karakter lalu $27,50 per 1 juta (Developer gratis 1 juta sekali), Google NMT $20 per 1 juta sesudah 500.000 gratis per bulan, gpt-6-luna $0,10 dan $0,50 per 1 juta token. DeepL gak menagih tag dan context; Google menagih semua karakter termasuk markup. Mesin gak mengenali {{slot}}: lindungi (<x i="0"/> untuk DeepL, <span translate="no"> untuk Google, instruksi plus JSON untuk LLM), kembalikan, lalu cek sintaks dan placeholder. Pakai glosarium untuk nama ("Homestay Kabut" tetap, "Kamar Teras" selalu テラスルーム). MT sering salah di konteks, idiom, dan konsistensi istilah, dan sumber Indonesia gak memberi enam bentuk jamak Arab, jadi semua hasil ditandai mt, dibaca manusia (post-editing), dan di-cache per teks sumber.