AI & Teknologi

Mengapa File Lokalisasi yang Diterjemahkan Merusak Aplikasi (dan Apa yang Harus Tetap Utuh)

Sep 23, 2026

Mengapa File Lokalisasi yang Diterjemahkan Merusak Aplikasi (dan Apa yang Harus Tetap Utuh)

File Lokalisasi Adalah Kode yang Berisi Kalimat

File bahasa PO, YAML, .properties, RESX, XLIFF, dan JSON tampak seperti daftar kalimat, tetapi hanya nilainya yang berupa teks. Kunci adalah pengenal yang dicari oleh kode; placeholder adalah slot yang diisi kode saat runtime; escape dan markup adalah sintaksis yang diandalkan parser. Penerjemah yang memperlakukan seluruh baris sebagai teks akan menghasilkan file yang terbaca indah tetapi gagal dimuat, atau berhasil dimuat lalu crash saat sebuah layar pertama kali memformat angka. Kegagalan ini biasanya hanya muncul dalam satu bahasa, sehingga menjadi jenis bug yang paling sulit ditemukan saat review.

Lima Hal yang Harus Lolos dari Penerjemahan Tanpa Perubahan

  • Kunci dan nama resource — kode mencari string berdasarkan kuncinya, jadi kunci yang diterjemahkan sama saja dengan string yang hilang.
  • Placeholder — %s, %1$d, {0}, {name}, dan argumen ICU diisi oleh kode; mengganti nama atau menghapus salah satunya merusak format atau memicu error saat runtime.
  • Escape dan aturan encoding — file .properties yang dibaca dengan metode klasik Properties.load(InputStream) diperlakukan sebagai Latin-1, dengan karakter lain ditulis sebagai escape \uXXXX, sehingga teks non-Latin mentah bisa berubah menjadi mojibake.
  • Markup di dalam string — tag HTML, kode inline XLIFF, dan Markdown harus tetap seimbang, atau string yang dirender akan merusak halaman di sekitarnya.
  • Struktur file — indentasi YAML, block scalar, anchor dan alias, serta nesting XML adalah sintaksis; indentasi yang bergeser atau nama anchor yang diterjemahkan mengubah makna file.

Bentuk Jamak Bukan Sekadar Bentuk Tunggal Ditambah "s"

Bahasa Inggris memiliki dua bentuk jamak, sehingga mudah mengira setiap bahasa juga begitu. Manual GNU gettext menunjukkan mengapa anggapan itu keliru: setiap bahasa mendeklarasikan aturan Plural-Forms miliknya sendiri, bahasa Inggris memakai nplurals=2, dan bahasa Rusia membutuhkan tiga bentuk yang dipilih berdasarkan digit terakhir angka. File PO yang diterjemahkan ke bahasa Rusia dengan hanya dua bentuk yang terisi tetap bisa dikompilasi, berjalan, dan mencetak tata bahasa yang salah untuk setiap jumlah yang berakhiran 2, 3, atau 4. Penanganan bentuk jamak yang benar berarti menghasilkan jumlah entri msgstr yang dibutuhkan bahasa target, bukan jumlah yang kebetulan dimiliki bahasa sumber.

Placeholder Terkadang Harus Berpindah Posisi

Urutan kata berbeda antarbahasa, sehingga kalimat dengan dua nilai sering kali harus menempatkannya dalam urutan terbalik. Placeholder posisional seperti %1$s dan %2$s, atau placeholder bernama seperti {count} dan {user}, ada tepat untuk itu: terjemahan boleh mengubah urutannya, tetapi setiap placeholder tetap harus muncul tepat satu kali. Placeholder anonim seperti %s polos tidak dapat diubah urutannya dengan aman — masalah yang sebaiknya diperbaiki di string sumber sebelum penerjemahan, bukan sesudahnya.

Aturan Format yang Perlu Diketahui Sebelum Menerjemahkan

Setiap format punya jebakannya sendiri. Di YAML, spesifikasinya memberi blok literal (|) dan blok terlipat (>) perilaku pemisah baris yang berbeda, dan anchor (&) serta alias (*) memungkinkan satu node memakai ulang node lain, jadi keduanya harus lolos tanpa diubah. XLIFF 2.1 membungkus format asli dalam elemen inline seperti <ph> dan <pc>, yang harus dipertahankan terjemahan di tempatnya di sekitar kata yang tepat. Di .NET, resource RESX dicari berdasarkan nama saat runtime untuk UI culture yang aktif, sehingga elemen data yang diganti namanya diam-diam kembali ke bahasa default. Dan file .properties Java memperlakukan =, :, atau spasi pertama yang tidak di-escape sebagai pemisah kunci, sehingga titik dua yang nyasar di kunci terjemahan akan membelahnya menjadi dua.

Daftar Periksa Review yang Menangkap Sebagian Besar Kerusakan

  1. Hitung placeholder di setiap string sumber dan target — multiset-nya harus sama, meskipun urutannya tidak.
  2. Bandingkan kuncinya, bukan nilainya — setiap kunci yang ada di sumber tetapi hilang atau diganti namanya di target adalah bug.
  3. Muat file terjemahan dengan parser sungguhan (msgfmt, YAML loader, ResXResourceReader) sebelum merilisnya.
  4. Periksa entri jamak terhadap aturan bahasa target, bukan bahasa sumber.
  5. Tampilkan terjemahan terpanjang di elemen UI tersempit — teks dalam bahasa lain sering kali lebih panjang daripada bahasa Inggris.
Mengapa aplikasi crash dalam satu bahasa tetapi tidak di bahasa lain?

Hampir selalu karena sebuah placeholder diubah hanya dalam bahasa itu — diganti namanya, dihapus, atau diduplikasi. Kode meneruskan argumen yang sama ke setiap bahasa, sehingga satu-satunya terjemahan yang tidak lagi cocok dengannya gagal saat layar tersebut diformat.

Mengapa bahasa Rusia membutuhkan tiga string jamak sementara bahasa Inggris hanya dua?

Aturan jamak adalah milik bahasa, bukan milik perangkat lunak. Gettext memungkinkan setiap bahasa mendeklarasikan aturannya sendiri; bahasa Rusia memilih di antara tiga bentuk berdasarkan digit terakhir angka, sehingga terjemahan dengan hanya dua bentuk mencetak tata bahasa yang salah untuk banyak jumlah.

Mengapa karakter beraksen berubah menjadi karakter acak di file .properties Java?

Karena metode klasik Properties.load(InputStream) membaca file sebagai Latin-1. Karakter di luar rentang itu harus ditulis sebagai escape \uXXXX, atau file harus dimuat dengan reader yang menggunakan encoding yang benar.

Bolehkah terjemahan mengubah urutan placeholder?

Boleh, jika placeholder-nya posisional (%1$s, %2$s) atau bernama ({count}, {user}) — mengubah urutan sering kali diperlukan agar susunan kata terasa alami. Setiap placeholder tetap harus muncul tepat satu kali. Placeholder %s polos tidak dapat diubah urutannya dengan aman.

Mengapa kunci tidak boleh diterjemahkan?

Kunci adalah pengenal, bukan teks. Kode meminta string berdasarkan kuncinya; kunci yang diterjemahkan berarti pencarian gagal dan aplikasi menampilkan kunci mentah atau kembali ke bahasa default.

Terjemahkan Nilainya, Pertahankan Kodenya

Unggah file PO, YAML, .properties, atau RESX dan terima kembali dengan kunci, placeholder, escape, dan struktur tetap persis di tempatnya.

Terjemahkan File Bahasa Gratis