Versi bahasa Inggeris bagi penganalisis Cache-Control yang baru dilancarkan memaparkan teks bahasa Jepun—statusnya tertulis “新鮮” dan bukannya “Fresh.” Kesilapan ini berpunca daripada logik dikongsi yang mengembalikan rentetan (string) bahasa Jepun yang dikodkan secara keras (hard-coded), sedangkan halaman tersebut hanya menyediakan label bahasa Inggeris.

Pembangun tersebut membina siri alatan pelayar yang ringan, di mana setiap satu mempunyai halaman bahasa Inggeris dan halaman bahasa Jepun yang menggunakan semula fungsi pemprosesan (parsing) dan logik teras yang sama. Hanya susunan kata yang kelihatan sahaja yang sepatutnya berbeza. Apabila penganalisis Cache-Control dilancarkan, antara muka bahasa Inggeris memaparkan label yang betul, tetapi nilai yang dipaparkannya datang daripada lapisan logik, yang masih mengandungi literal bahasa Jepun. Tiada ralat konsol yang muncul; halaman kelihatan normal, namun maklumat yang disampaikan kepada pengguna berbahasa Inggeris adalah salah.

Mengapa logik dikongsi boleh mengkhianati terjemahan

Pepijat tersebut berpunca daripada pilihan reka bentuk: fungsi teras yang menentukan apa yang perlu dipaparkan mengembalikan rentetan literal dalam bahasa Jepun. Lapisan halaman, yang bertanggungjawab untuk teks bahasa Inggeris di sekelilingnya, tidak berpeluang untuk menggantikan nilai-nilai tersebut. Oleh kerana logik dan UI diasingkan dengan jelas, masalah tersebut tidak kelihatan semasa ujian—segalanya "berfungsi" secara teknikal, walaupun bahasa yang dipaparkan kepada pengguna adalah salah.

Keburukannya ialah bahasa yang digunakan di dalam modul dikongsi tersebut menjadi lalai (default) bagi setiap bahagian hadapan (front-end) yang menggunakannya. Jika bahasa lain diperlukan, tetapan lalai tersebut menjadi pepijat tersembunyi.

Penyelesaian: kunci, pek, dan jaring keselamatan

Penulis menulis semula seni bina tersebut untuk mengasingkan tanggungjawab:

  • Pek mesej kini menyimpan semua rentetan yang boleh dibaca manusia bagi setiap bahasa.
  • Logik dikongsi hanya mengembalikan kunci simbolik, bukan teks mentah.
  • Halaman mencari perkataan yang sesuai daripada pek yang berkaitan berdasarkan kunci tersebut.

Apabila sesuatu mesej mesti menyertakan nombor, kod baharu menggunakan fungsi kecil dan bukannya rentetan templat (template string). Ini membolehkan setiap bahasa menentukan kedudukan nombor tersebut, bagi menyesuaikan perbezaan dalam susunan kata.

Satu langkah analisis statik yang mudah turut ditambah: proses binaan (build process) mengimbas fail dikongsi untuk mencari aksara bahasa Jepun. Jika terdapat sebarang aksara, pembangun akan diberi amaran dengan serta-merta, bagi menghalang teks asing yang dikodkan secara keras daripada masuk semula.

Apa yang dipelajari oleh penulis daripada pengalaman ini

  1. Terjemahan bertindak sebagai proses semakan. Semasa menulis mesej bahasa Inggeris, penulis menyedari bahawa beberapa padanan bahasa Jepun adalah samar. Terjemahan memaksa penggunaan frasa yang lebih jelas dalam kedua-dua bahasa.
  2. Fungsi dikongsi yang mengembalikan rentetan mengunci bahasa untuk semua orang. Jika sesuatu fungsi menentukan bahasa, mana-mana pengguna yang mengharapkan bahasa lain akan mewarisi kesilapan tersebut. Pepijat ini bukan sekadar ralat UI; ia adalah kecacatan logik.

Cadangan bagi sesiapa yang menyelenggara alatan pelbagai bahasa

  • Kembalikan kunci, bukan rentetan, daripada fungsi teras. Biarkan lapisan UI mengendalikan penyetempatan (localization).
  • Atau hantar rentetan yang dikehendaki ke dalam fungsi sebagai parameter. Ini memastikan logik tidak bergantung kepada bahasa tertentu.
  • Audit modul dikongsi untuk teks bahasa asli yang dikodkan secara keras. Carian pantas untuk aksara bukan ASCII boleh mendedahkan isu tersembunyi.
  • Tambah semakan semasa waktu binaan (build-time) untuk aksara asing dalam kod dikongsi. Pengesanan awal adalah lebih baik daripada kekeliruan selepas pelancaran.

Apa yang perlu diperhatikan seterusnya

Rumusan: Jika projek anda berkongsi kod antara versi bahasa, pastikan bahagian yang dikongsi itu tidak sesekali menentukan susunan kata. Biarkan setiap halaman menyediakan perkataannya sendiri, dan anda akan mengelakkan rasa malu apabila halaman bahasa Inggeris secara tidak sengaja bercakap dalam bahasa Jepun.