Game hasil terjemahan tidak jalan? Cari barisnya
Game hasil terjemahan Anda terbuka lalu langsung tertutup, atau macet selamanya di layar pemuatan. Salah satu baris yang Anda terjemahkan sebenarnya bukan teks: sebuah id, sebuah path, sebuah flag yang dibandingkan oleh game. Buktikan dulu bahwa penyebabnya memang terjemahan, lalu temukan barisnya dengan membelah dua: sekitar tiga belas ekspor memangkas lima ribu baris menjadi satu.
Jendela terbuka. Jendela tertutup. Kemarin game ini baik-baik saja, lalu Anda menghabiskan satu malam menerjemahkannya, dan sekarang ia mati.
Di suatu tempat di antara baris-baris itu ada satu yang sebenarnya bukan teks: nama sebuah scene, sebuah path berkas, sebuah flag yang dibandingkan game. Mesinnya menabrak baris itu dan menyerah sebelum menggambar apa pun.
Anda tidak akan membaca lima ribu baris untuk menemukannya. Anda akan mengajukan satu pertanyaan ya/tidak sekitar tiga belas kali.
Jawaban singkatnya. Buktikan dulu bahwa terjemahanlah penyebabnya, lalu belah dua: terjemahkan separuh baris yang dicurigai, ekspor, jalankan. Separuh yang gagal berisi baris Anda. Ulangi pada separuh itu sampai tersisa satu baris.
Sebelum berburu: benarkah ini soal terjemahan?
- Jalankan game aslinya. Bukan hasil ekspor Anda, tapi salinan yang belum disentuh. Kalau itu juga gagal, masalahnya ada di komputer Anda, di foldernya, atau di game itu sendiri.
- Terjemahkan satu baris pendek yang aman, ekspor, jalankan. Satu kata menu yang bisa Anda lihat di layar sudah cukup.
- Baru setelah itu mulailah mencari barisnya.
Langkah 2 sengaja berbunyi satu baris, bukan tanpa baris. Beberapa adaptor berhenti lebih awal ketika tidak ada yang perlu ditulis, jadi ekspor kosong hanya menguji penyalinan berkas alih-alih proses pengirimannya, dan bisa lolos padahal yang sebenarnya gagal.
Kalau build satu baris juga gagal, tidak ada satu baris pun yang bersalah dan membelah dua tidak akan menemukan apa-apa. Ekspor ulang ke folder kosong yang benar-benar baru, pastikan Anda menjalankan salinan hasil ekspor dan bukan yang asli, lalu baca peringatan dari ekspornya. Kalau masih gagal, laporkan sebagai masalah pengiriman.
Penyaringan awal ini memakan dua kali menjalankan game dan satu ekspor: beberapa menit pada proyek RPG Maker kecil, lebih lama pada game Unity besar. Imbalannya, Anda tidak menghabiskan satu malam mencari baris yang memang tidak ada.
Dua hal yang mirip tetapi berbeda. Kotak-kotak, tanda tanya, atau huruf Latin rusak sementara game tetap jalan adalah masalah font atau enkode. Crash tepat setelah memasang plugin atau overlay adalah soal alatnya, bukan baris Anda.
Temukan barisnya dengan membelah dua
Sebagian besar proyek berisi banyak berkas, dan daftar berkas adalah hal yang paling mudah dipotong menjadi dua.
- Atur ulang semua terjemahan dari bilah alat.
- Buka Pilih berkas untuk diterjemahkan, yang menjelaskan dirinya sendiri: «Pilih berkas mana yang diterjemahkan. Berkas yang tidak dicentang dibiarkan utuh.» Hapus centang separuh berkas dan terjemahkan sisanya.
- Ekspor ke folder kosong yang baru lalu jalankan game.
- Kalau jalan, baris Anda ada di separuh yang tidak Anda sentuh; kalau tidak, ada di separuh yang baru saja Anda terjemahkan. Bagaimanapun, daftar Anda tinggal setengah, dan separuh lainnya bisa dilupakan.
- Atur ulang semua terjemahan lagi, belah dua daftar yang tersisa, ekspor, jalankan.
- Ulangi sampai tersisa satu berkas, lalu belah dua di dalam berkas itu sampai tersisa satu baris.
Membelah per berkas lebih kasar daripada per baris, jadi jumlah putaran mengikuti jumlah berkas Anda: empat puluh berkas berarti sekitar enam putaran untuk sampai ke berkasnya, lalu Anda mulai lagi di dalamnya.
Proyek satu berkas — sebuah skrip NScripter, game Kirikiri atau Wolf dengan satu skenario — tidak punya daftar berkas untuk dipotong. Sebagai gantinya, seret kotak menyusuri barisnya: kotak centang dan bilah aksi massal muncul sendiri, dan Terjemahkan ulang yang dipilih mengerjakan sisanya. Untuk sapuan yang lebih luas, persempit dulu barisnya dengan filter dan pencarian, lalu gunakan Pilih semua yang terlihat. Hati-hati dengan yang satu itu: ia mengambil persis apa yang sedang ditampilkan filter, jadi filter yang lupa Anda bersihkan diam-diam mencemari semua putaran berikutnya. Catat filter yang Anda pakai.
Satu kelompok rusak berisi seratus baris, dimainkan sampai tuntas:
- Putaran 1 — 100 dicurigai, terjemahkan 50 pertama: jalan, berarti ada di 50 sisanya.
- Putaran 2 — 50 dicurigai, terjemahkan 25 pertama: rusak, berarti ada di 25 ini.
- Putaran 3 — 25 dicurigai, terjemahkan 13 pertama: jalan, berarti ada di 12 sisanya.
- Putaran 4 — 12 dicurigai, terjemahkan 6 pertama: rusak, berarti ada di 6 ini.
- Putaran 5 — 6 dicurigai, terjemahkan 3 pertama: rusak, berarti ada di 3 ini.
- Putaran 6 — 3 dicurigai, terjemahkan 2 pertama: jalan, tersisa satu baris.
Tujuh ekspor adalah kasus terburuk dari seratus baris, dan sekitar tiga belas kasus terburuk dari lima ribu.
Berapa biaya satu putaran
Satu ekspor, satu kali menjalankan, dan berapa lama game itu sampai ke baris dialog pertamanya. Dua sampai tiga menit pada proyek RPG Maker kecil. Pada game Unity besar, di mana ekspor menyalin seluruh game dan layar judulnya santai, lebih dekat ke sepuluh.
Jadi tiga belas putaran hampir memakan satu malam penuh. Itu tetap pilihan yang murah, karena alternatifnya adalah membaca lima ribu baris dan menebak dengan benar.
Dua hal yang sering keliru saat dikerjakan manual. Ekspor ke folder kosong yang baru setiap putaran, karena beberapa mesin memasang patch secara menumpuk, sehingga putaran 3 yang jatuh di atas putaran 1 dan 2 menguji ketiganya sekaligus. Atur ulang berarti benar-benar atur ulang: gunakan Atur ulang semua terjemahan, jangan suntingan manual, karena perintah itu mengembalikan teks yang direkam saat proyek dibuat sekalipun Anda sudah menimpa folder sumbernya.
Kalau tetap gagal setelah baris itu dikembalikan
Berarti jumlahnya lebih dari satu, dan itu hasil normal dari percobaan pertama menerjemahkan-semuanya pada mesin yang sensitif terhadap penguraian. Biarkan baris itu tetap dalam bahasa asal dan jalankan lagi siklusnya atas semua yang masih diterjemahkan. Pelaku kedua sering kali jenis string yang sama dengan yang pertama, di berkas yang sama pula.
Lain kali, terjemahkan per kelompok
Pengelompokan tidak menghemat ekspor; ini ekspor yang toh akan Anda buat, dan setiap kegagalan datang sudah terlokalisasi. Rusaknya di kelompok terakhir, jadi pembelahan dimulai dari seratus baris, bukan lima ribu. Mulai dari 100, lalu naikkan ke 500 atau satu berkas penuh setelah beberapa kelompok berjalan mulus.
Mesin mana yang rusak kalau Anda menerjemahkan baris yang salah?
Orang bicara soal mesin yang ketat dan mesin yang santai. Yang benar-benar menentukan adalah ke mana terjemahan Anda mendarat.
Sebagian mesin membacanya sebagai data: berkas terpisah plus kait saat runtime pada Ren'Py, JSON ber-escape pada RPG Maker, sebuah nilai .locres yang hash kuncinya dipertahankan utuh pada Unreal. Struktur game tidak pernah melihat teks Anda, jadi baris yang salah hanya berbiaya satu baris yang salah. Sebagian lain menyisipkannya ke berkas yang diurai game sebagai skrip, markup, atau aliran byte, dan kalimat Anda menjadi bagian dari struktur berkas itu. Di sana satu titik dua, satu kurung siku, satu byte berlebih, atau sebuah string yang juga merupakan kunci pencarian sudah cukup untuk menghentikan game.
Itu saja aturannya. Cari mesin Anda, baca barisnya, lalu lanjut.
- RPG Maker MV/MZ — tidak ada yang struktural: JSON dan CSV ber-escape, dan hanya sekumpulan perintah event tetap yang ditawarkan. Satu-satunya risiko nyata adalah plugin yang mencocokkan nama pembicara secara persis, dan ekspor ikut menulis ulang kunci plugin itu.
- Ren'Py — nyaris tidak ada. Kode sumbernya tidak pernah ditulis ulang, jadi string yang sekaligus menjadi kunci logika tetap aman.
- Unreal Engine — tidak ada mode kegagalan tingkat baris yang pernah kami lihat: string
.locresmemang teks tampilan secara desain. Risikonya di sini adalah teks yang hilang, bukan build yang mati. - Unity — parah dan senyap: nama scene, kunci variabel, dan callback disimpan persis seperti dialog. Siapkan diri untuk pemuatan tanpa henti, tombol yang mati, atau layar hitam.
- Godot — parah. Path node, StringName, dan rujukan
res://adalah alamat yang dicari mesin; penulisan balik menolaknya. - Wolf RPG — format paling rapuh di sini. Pergeseran satu byte membuat seluruh aliran tidak sinkron dan prosesnya berhenti bahkan sebelum ada jendela.
- Kirikiri / KAG — parah: kurung siku adalah sintaks dan nama penyimpanan adalah nama berkas. Nama tag yang diterjemahkan, kurung yang dikonversi, atau nama berkas gambar yang diterjemahkan masing-masing menghentikan game seketika.
- Electron VN — parah. Placeholder templat yang ditulis ke dalam JavaScript hidup di
app.asaradalah galat sintaks, bukan terjemahan yang buruk. - TyranoBuilder / TyranoScript — sekeluarga dengan Kirikiri: tag KAG adalah markup, jadi tag yang diterjemahkan berarti sintaks. Rujukan karakter sebaris tidak pernah ditulis ulang.
- NScripter — parah dan khas:
?,%, dan$adalah penanda variabel, jadi satu saja yang tersasar menjadi galat sintaks. - YU-RIS — parah, karena banyak yang disebut string oleh format ini sebenarnya operand. Memisahkan keduanya membawa satu game dari 40.678 baris aktif menjadi 8.914, tanpa kehilangan dialog.
Mesin lain punya halamannya sendiri, masing-masing dengan panduan, di mesin.
Tiga baris yang membunuh sebuah game
Setiap aturan pengecualian di RuneTranslate dibayar oleh sebuah game yang berhenti berjalan. Ketiganya sudah diperbaiki. Pada tiap kasus, baris yang merusak tampak sangat masuk akal dan ekspornya selesai dengan warna hijau.
Godot: game mengarang seorang tokoh. Sebuah baris berbunyi Warning: the door is locked. Bahasa Inggris yang sempurna. Dialogic meng-escape setiap titik dua pada teks tersimpan, karena titik dua tanpa escape justru cara ia memisahkan nama pembicara. Ditulis balik apa adanya, kalimat itu terbaca ulang sebagai tokoh bernama Warning yang berkata the door is locked, dan addon-nya pun benar-benar membuatnya.
Kirikiri: game mencari berkas bernama `End`. Tag sebuah tombol memuat nama berkas gambar dan label tujuan, sementara penyamarannya tidak bisa mencakup tag yang punya kurung sendiri, sehingga keduanya terbuka dan ikut diterjemahkan. Kini pemindainya paham kurung: ia menutup pada kurung pasangannya, sehingga ekspresi bersarang tetap di dalam tag sedangkan tag biasa berakhir di ] pertamanya.
RPG Maker: sebuah potret hilang diam-diam. Plugin potret memilih gambar tokoh dengan membandingkan nama pembicara, huruf demi huruf, terhadap tabel di konfigurasinya sendiri. Menerjemahkan namanya benar; membiarkan konfigurasi itu juga benar, sebab isinya penuh kunci aset. Digabung, keduanya mematahkan kesamaan itu, dan potret tokoh tersebut lenyap tanpa catatan apa pun.
Ketiga ekspor melaporkan sukses. Ekspor yang bersih bukan bukti game yang berjalan, di mesin mana pun. Satu-satunya bukti adalah menjalankannya.
Ketika penyebabnya sama sekali bukan baris Anda
Membelah dua tidak menemukan kasus-kasus ini, karena tidak ada separuh yang bisa jalan: masalahnya ada pada ke mana hasil ekspor mendarat. Game Wolf RPG membaca arsip .wolf miliknya sebelum berkas lepas apa pun di sebelahnya, sehingga satu game menampilkan layar judul sementara data terjemahannya tergeletak di disk tanpa pernah dibaca. Addressables milik Unity menolak bundel yang byte-nya tidak lagi cocok dengan checksum-nya, dan memberi Anda layar hitam tanpa satu pun catatan log. Game RPG Maker yang terbungkus mengabaikan berkas data di sebelah berkas eksekusinya. Ketiganya kini sudah ditangani, dan karena itu kegagalan pengiriman lebih layak dilaporkan daripada diburu.
Adakah penanda yang menunjukkan baris mana yang dialog?
Tidak ada. Dan curigailah siapa pun yang bilang sebaliknya.
Seorang pengguna pernah bercerita bahwa ia menemukan satu game Godot yang membungkus setiap string dialog dengan ||; ia hanya menerjemahkan yang itu, dan game-nya berjalan. Untuk game tersebut memang berguna. Tapi itu kebiasaan satu pengembang, bukan konvensi Godot, dan game berikutnya akan melakukan hal lain.
Contoh sebaliknya datang dari YU-RIS. Pada satu game, kanal backtick memuat seluruh tabel string antarmuka, 687 dari 692 barisnya adalah teks tampilan — dan backtick di sana tetap tidak bermakna apa-apa. Ketiga gaya kutip dikompilasi menjadi hal yang sama, jadi aturan yang dibangun di atas pembatas justru menandai prosa sungguhan. Di mana nilainya berada memberi tahu Anda segalanya; bagaimana ia dikutip tidak memberi tahu apa pun.
Andalkan posisi dan bentuk, dan biarkan game itu sendiri yang mengajari Anda keduanya. Jalankan, baca baris dialog pertama di layar, lalu temukan baris persis itu di editor: berkasnya, grupnya, dan tetangganya adalah wajah dialog pada game ini. Apa pun yang berada di tempat lain adalah kandidat untuk bukan dialog.
Apa yang ditandai aplikasi, dan apa yang tidak bisa diketahuinya
RuneTranslate menandai baris yang diyakininya sebagai kode, path aset, atau id sebagai dikecualikan. Baris itu tetap terlihat alih-alih disembunyikan, diberi warna oranye di balik sakelar tampilkan yang dikecualikan, supaya Anda bisa melihat keputusannya dan memaksa baris mana pun lewat terjemahkan saja. Anda juga bisa menambahkan pola sendiri.
Pilih baris yang dikecualikan lalu mulai proses, dan ia berhenti untuk bertanya: «12 dari 340 baris yang Anda pilih dikecualikan — ditandai oleh filter Anda, atau oleh RuneTranslate sebagai kode, path aset, atau ID. Menerjemahkannya bisa merusak game. Melewati berarti tetap mengecualikannya. Menerjemahkannya juga memasukkannya untuk proses berikutnya.»
Menerobos tidak apa-apa. Cukup ingat bahwa Anda melakukannya, karena itulah tempat pertama yang perlu diperiksa ketika hasil ekspor berhenti bisa dijalankan.
Satu batasan yang jujur: pengecualian adalah tebakan atas sebuah string, jadi ia tidak bisa tahu bahwa satu kalimat di game Anda sekaligus menjadi kunci pencarian di suatu plugin yang dibawa game itu. Game yang bahasa sumbernya sudah bahasa Inggris bahkan kurang terlindungi, karena filter terkuat justru menanyakan apakah sebuah string memuat teks dalam bahasa sumber.
Pertanyaan yang sering diajukan
Kenapa game saya tidak jalan setelah diterjemahkan?
Hampir selalu karena satu baris yang Anda terjemahkan sebenarnya pengenal, path, nama scene, atau flag yang dibandingkan game secara persis. Mengubahnya merusak penguraian, atau pencariannya.
Bagaimana menemukan baris terjemahan mana yang merusak game?
Belah dua. Atur ulang semua terjemahan, terjemahkan separuhnya, ekspor ke folder kosong, jalankan. Separuh yang gagal berisi barisnya; belah dua lagi dan ulangi. Enam sampai tujuh putaran dari seratus baris, sekitar tiga belas dari lima ribu.
Game terjemahan saya langsung menutup — apa artinya?
Galat fatal saat startup. Pada Kirikiri, visual novel Electron, dan NScripter biasanya galat sintaks: kurung, tanda kutip, atau placeholder yang ikut diterjemahkan atau hilang. Pada Wolf RPG dan YU-RIS, aliran yang tidak sinkron.
Kenapa game terjemahan saya terbuka ke layar hitam?
Biasanya pemuatan yang gagal di dalam kode yang menelan pengecualiannya; pada Unity, sebuah bundel yang checksum-nya tidak lagi cocok dengan entri katalognya. Coba build dengan satu baris aman yang diterjemahkan: kalau itu juga hitam, penyebabnya pengiriman, bukan baris mana pun.
Game terjemahan saya macet di layar pemuatan — apakah itu terjemahannya?
Sangat mungkin, kalau ini Unity. Pemuatan tanpa henti adalah gejala klasik nama scene atau kunci variabel yang ikut diterjemahkan: game menunggu nama yang sudah tidak cocok lagi, dan tidak ada galat yang dilempar.
Jenis baris apa yang tidak boleh diterjemahkan?
Apa pun yang diselesaikan game lewat pencocokan string persis: path, nama scene dan node, nama variabel dan event, kode bahasa, apa pun yang berbentuk snake_case atau res://. Kalau Anda tidak bisa membayangkan seorang pemain membacanya di layar, biarkan saja.
Game-nya jalan tapi teksnya kotak atau tanda tanya — apakah ini masalah yang sama?
Bukan. Kotak yang seragam berarti font tidak punya glif untuk karakter itu; tanda tanya harfiah berarti karakternya hilang saat berkas ditulis. Keduanya masalah font atau enkode, dengan solusi yang berbeda.
Ke mana selanjutnya
Sedang memulai terjemahan, bukan memperbaikinya? Cara membuat patch terjemahan membahas seluruh prosesnya.
Setelah barisnya ketemu: biarkan dalam bahasa aslinya, terjemahkan semua yang ada di sekitarnya, ekspor ke folder kosong yang baru, lalu jalankan. Satu pengenal yang tidak diterjemahkan tidak merugikan pemain sama sekali.
Siap mencoba RuneTranslate?
Tier gratis membuka setiap engine + setiap penyedia terjemahan. Supporter ($3/mo) membuka kecepatan penuh.
Unduh untuk Windows
