Versi bahasa Inggris dari alat penganalisis Cache-Control yang baru dirilis menampilkan teks bahasa Jepang—statusnya tertulis “新鮮” alih-alih “Fresh.” Kesalahan ini berakar pada logika bersama (shared logic) yang mengembalikan string bahasa Jepang yang ditulis secara hard-coded, sementara halaman tersebut hanya menyediakan label bahasa Inggris.

Pengembang tersebut membangun serangkaian alat peramban ringan, yang masing-masing memiliki halaman bahasa Inggris dan halaman bahasa Jepang yang menggunakan kembali fungsi parsing dan logika inti yang sama. Hanya pilihan kata yang terlihat yang seharusnya berbeda. Saat penganalisis Cache-Control dirilis, antarmuka bahasa Inggris menampilkan label yang benar, tetapi nilai yang dirender berasal dari lapisan logika, yang masih berisi literal bahasa Jepang. Tidak ada kesalahan konsol yang muncul; halaman tampak normal, namun informasi yang disajikan kepada pengguna berbahasa Inggris salah.

Mengapa logika bersama dapat mengkhianati terjemahan

Bug tersebut berasal dari pilihan desain: fungsi inti yang menentukan apa yang harus ditampilkan mengembalikan string literal dalam bahasa Jepang. Lapisan halaman, yang bertanggung jawab atas teks bahasa Inggris di sekitarnya, tidak pernah mendapatkan kesempatan untuk mengganti nilai-nilai tersebut. Karena logika dan UI dipisahkan dengan bersih, masalah ini tetap tidak terlihat selama pengujian—secara teknis semuanya "berjalan" dengan baik, meskipun bahasa yang ditampilkan kepada pengguna salah.

Sisi negatifnya adalah bahasa yang digunakan di dalam modul bersama menjadi default bagi setiap front-end yang mengonsumsinya. Jika bahasa lain diperlukan, nilai default tersebut menjadi bug yang tersembunyi.

Solusinya: kunci, paket, dan jaring pengaman

Penulis menulis ulang arsitekturnya untuk memisahkan tanggung jawab (separate concerns):

  • Message packs kini menyimpan semua string yang dapat dibaca manusia untuk setiap bahasa.
  • Shared logic hanya mengembalikan kunci simbolis, tidak pernah teks mentah.
  • Pages mencari kata yang sesuai dari paket yang relevan berdasarkan kunci tersebut.

Ketika sebuah pesan harus menyertakan angka, kode baru menggunakan fungsi kecil alih-alih template string. Hal ini memungkinkan setiap bahasa menentukan di mana posisi angka tersebut, guna mengakomodasi perbedaan dalam urutan kata.

Langkah analisis statis sederhana juga ditambahkan: proses build memindai file bersama untuk mencari karakter bahasa Jepang. Jika ada yang muncul, pengembang akan segera mendapatkan peringatan, mencegah teks asing yang ditulis secara hard-coded masuk kembali.

Apa yang dipelajari penulis dari pengalaman ini

  1. Terjemahan berfungsi sebagai tahap peninjauan. Saat menulis pesan bahasa Inggris, penulis menyadari bahwa beberapa padanan bahasa Jepangnya terasa ambigu. Menerjemahkannya memaksa penggunaan frasa yang lebih jelas dalam kedua bahasa.
  2. Fungsi bersama yang mengembalikan string akan mengunci bahasa bagi semua orang. Jika sebuah fungsi menentukan bahasa, konsumen mana pun yang mengharapkan bahasa berbeda akan mewarisi kesalahan tersebut. Bug ini bukan sekadar gangguan UI; ini adalah cacat logika.

Rekomendasi bagi siapa pun yang memelihara alat multibahasa

  • Kembalikan kunci, bukan string, dari fungsi inti. Biarkan lapisan UI menangani lokalisasi.
  • Atau masukkan string yang diinginkan ke dalam fungsi sebagai parameter. Ini menjaga agar logika tetap agnostik terhadap bahasa.
  • Audit modul bersama untuk teks bahasa asli yang ditulis secara hard-coded. Pencarian cepat terhadap karakter non-ASCII dapat mengungkap masalah tersembunyi.
  • Tambahkan pemeriksaan saat waktu build untuk karakter asing dalam kode bersama. Deteksi dini lebih baik daripada kebingungan setelah rilis.

Apa yang perlu diperhatikan selanjutnya

Poin penting: Jika proyek Anda berbagi kode di antara versi bahasa yang berbeda, pastikan bagian yang dibagikan tersebut tidak pernah menentukan pilihan kata. Biarkan setiap halaman menyediakan katanya sendiri, dan Anda akan terhindar dari rasa malu karena halaman bahasa Inggris yang secara tidak sengaja berbicara bahasa Jepang.