Machine Translation Integration — i18n

Machine Translation Integration Machine Translation (MT) bisa mempercepat proses terjemahan secara drastis. Tapi MT bukan pengganti human translator —…

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}}'

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" }
  ]
}

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:

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 }

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari