XUnity.AutoTranslator tidak menerjemahkan
XUnity.AutoTranslator adalah penerjemah runtime terbaik yang dimiliki Unity, dan ketika ia diam penyebabnya hampir selalu salah satu dari lima hal spesifik: gamenya build IL2CPP, teksnya diatur lewat jalur yang tidak dicegat hook, framework UI yang menggambarnya tidak diaktifkan, barisnya lebih panjang dari batas karakter, atau endpoint-nya mematikan diri sendiri. Berikut cara mengetahui yang mana yang Anda hadapi.
XUnity.AutoTranslator gratis, berlisensi MIT, dirawat aktif, dan merupakan alat terjemahan runtime terbaik yang dimiliki Unity. Ia bekerja dengan meng-hook momen sebuah game menyerahkan string ke komponen teks lalu menukarnya dengan terjemahan sebelum digambar. Desain itulah sebabnya ia sama sekali tak perlu tahu format berkas game — dan itu juga sebabnya, ketika gagal, ia gagal diam-diam. Tak ada yang crash. Gamenya sekadar berjalan dalam bahasa Jepang.
Lima hal di bawah ini menjelaskan hampir tiap laporan "tidak menerjemahkan". Telusuri berurutan; masing-masing punya perbaikan berbeda, dan menebak-nebak di antaranya menghabiskan banyak malam.
Pertama: baca log, bukan layar
Plugin ini berisik soal apa yang sedang dilakukannya, dan log adalah satu-satunya tempat ia mengatakannya. Pada instalasi BepInEx, lihat BepInEx/LogOutput.log. Log Unity sendiri duduk di sebelahnya di <Game>_Data/output_log.txt pada build lama, atau %APPDATA%/../LocalLow/<Company>/<Game>/Player.log pada build yang lebih baru.
- Apakah log menyebut XUnity.AutoTranslator dimuat sama sekali? Kalau tidak, masalahnya ada di loader, bukan di penerjemahnya — Anda berada di mode kegagalan satu.
- Apakah ia mendaftar sebuah endpoint yang diinisialisasi, lalu menyebut satu endpoint dimatikan setelah error berulang? Itu mode kegagalan lima.
- Apakah terjemahan ditulis ke
BepInEx/Translation/<lang>/Text/_AutoGeneratedTranslations.txt? Kalau berkas itu terisi terjemahan yang benar tetapi tak pernah muncul di layar, sisi jaringannya sehat dan sisi tampilannya yang tidak. - Tekan ALT+1 di dalam game untuk membuka jendela agregator terjemahan. Kalau ia menampilkan baris yang sedang Anda lihat, hook-nya melihatnya. Kalau tetap kosong, hook-nya tak pernah melihatnya.
Pemisahan terakhir itu — "diterjemahkan tetapi tidak ditampilkan" versus "tak pernah terlihat" — adalah persimpangan jalannya. Semua di bawah bergantung padanya.
1. Gamenya adalah build IL2CPP
Unity mengirim game dalam dua runtime yang sangat berbeda. Mono menyimpan C# milik game sebagai assembly .NET biasa di <Game>_Data/Managed/, termasuk Assembly-CSharp.dll, dengan nama tipe dan metode utuh. IL2CPP mengubah C# itu menjadi C++ lebih dulu lalu mengompilasinya ke GameAssembly.dll native; sisa sistem tipenya dikemas ke <Game>_Data/il2cpp_data/Metadata/global-metadata.dat.
Sebuah hook runtime perlu menemukan metode lalu menggantinya. Pada Mono itu soal refleksi biasa. Pada IL2CPP tak ada metode terkelola untuk direfleksikan — kodenya native, dan satu-satunya jalan kembali ke nama, kolom, dan alamat metode adalah mengurai global-metadata.dat lalu merekonstruksi tata letaknya. Itu loader yang sama sekali berbeda, bukan sebuah pengaturan.
- Cara mengeceknya dalam lima detik: ada
GameAssembly.dlldi sebelah exe game, plus folderil2cpp_data, berarti IL2CPP. FolderManaged/yang penuh DLL berarti Mono. - IL2CPP butuh BepInEx varian IL2CPP, dan rilis XUnity.AutoTranslator yang dibangun untuknya. Build Mono tak akan dimuat — ia sekadar tak muncul di log, yang terbaca persis seperti "plugin-nya rusak".
- Lebar bit juga penting. Game 64-bit butuh loader 64-bit. Pasangan yang tak cocok gagal dengan cara sunyi yang sama.
- Sebagian game mengirim berkas metadata yang tak bisa diurai. Packer dan lapisan anti-tamper mengenkripsi atau menyusun ulang
global-metadata.dat, dan tiap alat yang bergantung pada pembacaannya — termasuk hook — berhenti di situ.
2. Plugin termuat, dan teksnya tak pernah muncul
Plugin ada di log, endpoint terinisialisasi, _AutoGeneratedTranslations.txt bertambah — dan layarnya tak berubah. Hook menerjemahkan string yang lalu dibuang game, atau game mengatur teks lewat jalur yang tidak dicegat hook.
TextGetterCompatibilityMode
Banyak game membaca kembali teks yang baru saja mereka atur — untuk mengukurnya, menambahinya, atau membandingkannya dengan sesuatu. Begitu komponennya memegang string terjemahan, pembacaan balik itu mengembalikan terjemahannya, logika milik game bekerja atas teks yang tidak ia tulis, dan hasilnya berkisar dari satu baris yang kembali ke aslinya sampai tata letak yang ambruk. TextGetterCompatibilityMode di AutoTranslatorConfig.ini membuat getter mengembalikan string asli kepada game sementara pemain tetap melihat yang terjemahan. Ia mati secara bawaan karena memakan kerja di tiap pembacaan, dan ia adalah saklar pertama yang dicoba ketika teks berkedip, kembali ke asli, atau menolak menetap.
Separuh lainnya dari kategori ini adalah teks yang memang tak pernah diatur lewat API yang di-hook sejak awal: game yang merender lewat mesin teksnya sendiri, mengalirkan karakter langsung ke mesh, atau memanggang dialog ke dalam sprite. Tak ada konfigurasi untuk itu — titik cegatnya tidak ada. Teks yang dipanggang ke dalam artwork adalah masalah yang sepenuhnya terpisah, dan butuh terjemahan gambar, bukan hook apa pun.
3. Hanya sebagian teks yang diterjemahkan
Menu diterjemahkan, dialog tidak. Atau dialog diterjemahkan dan tiap tombol tetap berbahasa Jepang. Ini hampir selalu framework UI yang tidak diaktifkan, karena plugin meng-hook masing-masing secara terpisah dan tidak semuanya menyala secara bawaan.
- Menyala secara bawaan: UGUI (UI bawaan Unity), NGUI, TextMeshPro, dan UIElements (
EnableUGUI,EnableNGUI,EnableTextMeshPro,EnableUIElements). Bersama-sama mereka mencakup sebagian besar game modern, termasuk framework visual novel seperti Utage, yang menggambar lewat mereka alih-alih membawa saklarnya sendiri. - Mati secara bawaan: IMGUI dan komponen
TextMeshlawas. IMGUI adalah GUI mode-langsung Unity — ia menggambar ulang tiap frame, jadi meng-hook-nya berarti menerjemahkan di tiap frame, dan ia dinonaktifkan demi performa, bukan karena tak berfungsi. - Flag-nya ada di `AutoTranslatorConfig.ini` sebagai
EnableIMGUI,EnableTextMesh, dan saudara-saudaranya. Setel yang dipakai game Anda keTruelalu jalankan ulang. - Game Unity lawas dan doujin Jepang adalah kasus IMGUI yang lazim. Game yang menunya tampak seperti kotak abu-abu polos dengan gaya bawaan adalah petunjuk kuat.
Kalau menyalakan semuanya tak mengubah apa pun, teksnya sama sekali tidak lewat komponen teks Unity — kembali ke mode kegagalan dua.
4. Baris panjang dilewati, bukan diterjemahkan
MaxCharactersPerTranslation bawaannya 200. Apa pun yang lebih panjang dilewati. Bukan dipotong, bukan dicoba ulang, bukan dicatat dengan cara yang akan Anda sadari saat bermain — dilewati, sehingga barisnya terender dalam bahasa asli dan tak ada yang tampak rusak.
Ini mode kegagalan yang paling lama diburu orang, karena buktinya sangat lemah: sebagian besar game diterjemahkan, lalu satu paragraf tidak. Visual novel adalah korban yang lazim — blok narasi panjang atau monolog tanpa jeda baris melewati 200 karakter dengan mudah, dan justru itulah teks yang paling ingin Anda terjemahkan.
Naikkan nilainya di AutoTranslatorConfig.ini lalu jalankan ulang. Ingat bahwa Anda juga menaikkan biaya tiap permintaan: endpoint gratis punya batas panjang per permintaannya sendiri dan akan mulai menolak permintaan yang melewatinya, jadi nilai yang sangat besar menukar pelewatan senyap dengan error endpoint yang terlihat. Kisaran 500–1000 mencakup prosa VN biasa.
5. Endpoint gagal atau membatasi laju Anda
Endpoint bawaan XUnity adalah layanan terjemahan publik gratis yang diakses seperti sebuah peramban mengaksesnya. Mereka bukan kontraktual, dan mereka berubah. Ketika serangkaian permintaan gagal berturut-turut, plugin mematikan endpoint itu untuk sisa sesi alih-alih terus menghantamnya — keputusan yang disengaja dan bagus, yang juga berarti semua setelah titik itu diam-diam tetap tak diterjemahkan sampai Anda menjalankan ulang game.
- Cari baris shutdown di log. Kalau ada, perbaikannya adalah menjalankan ulang plus mengubah sesuatu — bukan menunggu lebih lama.
- Perlambat antreannya.
MaxTranslationsQueuedPerSeconddan pengaturan jedanya ada karena ledakan permintaanlah yang memicu batas laju. Mempercepat maju lewat sebuah VN mengirim ratusan permintaan dalam hitungan detik. - Ganti endpoint. Kalau satu layanan gratis sedang bermasalah, biasanya yang lain tidak.
- Pakai endpoint berkunci. Kunci DeepL sungguhan atau API berbayar menghapus seluruh kategori masalah ini, dengan konsekuensi harus punya kunci API berbayar.
- Perbarui plugin-nya. Ketika protokol sebuah endpoint gratis berubah, perbaikannya datang sebagai rilis. Menjalankan build berumur dua tahun terhadap layanan yang sudah pindah adalah penyebab umum "dulu ini jalan".
Bonus: teksnya diterjemahkan dan terender sebagai kotak
Yang satu ini sama sekali bukan kegagalan terjemahan. Game mengirim atlas font yang berisi persis glif yang dibutuhkan bahasa aslinya, dan bahasa target Anda butuh glif yang tak ada di sana, sehingga tiap karakter yang hilang tergambar sebagai kotak atau bidang kosong. XUnity punya OverrideFont dan OverrideFontTextMeshPro persis untuk ini. Perhatikan sidik jarinya: kotak berarti glif hilang; karakter `?` harfiah berarti masalah encoding di suatu titik sebelumnya dalam rantai. Keduanya bug berbeda dan pengaturan font hanya memperbaiki yang pertama.
Urutan menelusurinya
- Pastikan Mono atau IL2CPP dengan mencari
GameAssembly.dll, dan pastikan Anda memasang loader yang cocok. - Buka
BepInEx/LogOutput.logdan pastikan plugin termuat serta sebuah endpoint terinisialisasi. - Tekan ALT+0 di dalam game untuk membuka jendela milik plugin — kalau tak ada yang muncul, plugin-nya tidak termuat. ALT+1 membuka Translation Aggregator: kosong berarti hook tak pernah melihat teksnya, terisi berarti ia melihatnya.
- Kalau hook melihatnya tetapi layar tak berubah, nyalakan
TextGetterCompatibilityMode. - Kalau hanya sebagian game yang diterjemahkan, aktifkan IMGUI dan TextMesh lawas.
- Kalau baris panjang tertentu tetap tak diterjemahkan, naikkan
MaxCharactersPerTranslationdari bawaannya 200. - Kalau semuanya berhenti di tengah sesi, cari baris shutdown endpoint, lalu jalankan ulang dengan antrean lebih lambat atau endpoint lain.
Ketika hook adalah bentuk yang salah untuk pekerjaannya
Tiap kegagalan di atas berujung ke akar yang sama: sebuah hook runtime hanya bisa menerjemahkan teks yang ia hadir untuk dicegat. Kalau game tidak mengatur string lewat API yang dikenal plugin, atau teksnya digambar sebelum plugin dimuat, atau runtime-nya tidak mengekspos metode untuk di-hook, tak ada yang bisa dikonfigurasi. Alatnya bekerja dengan benar dan teksnya memang di luar jangkauan.
Alternatif strukturalnya adalah bekerja pada berkas, bukan pada frame. Alat level-berkas membuka aset milik game, menarik string keluar, menerjemahkannya, lalu menulis salinan terjemahan dari game — sehingga teksnya sudah dalam bahasa target sebelum engine memuatnya sama sekali. Tanpa hook, tanpa titik cegat, tanpa flag per-framework, dan batas karakternya sebesar apa pun yang muat di formatnya. Itulah yang dilakukan RuneTranslate, pada Unity dan 16 engine serta format lain.
Pertukarannya nyata dan berjalan ke arah sebaliknya. Alat level-berkas hanya menjangkau teks yang ada di dalam berkas — untuk Unity itu berarti TextAsset, kolom string MonoBehaviour, skrip StreamingAssets, tabel lokalisasi, dan asset bundle, termasuk bundle Addressable terenkripsi AES. Ia butuh langkah ekspor sebelum Anda bermain, bukan menerjemahkan sambil jalan. Dan ia tak bisa berbuat apa-apa terhadap teks yang game Anda rakit saat runtime dari potongan-potongan. Unity adalah engine sebisa mungkin justru karena alasan ini: apa yang dieksternalkan sebuah game sangat bervariasi, dan membuka proyeknyalah yang memberi tahu Anda apa yang Anda punya.
- Teks yang dikompilasi ke dalam kode C# adalah batas kerasnya. Pada build Mono, RuneTranslate membaca literal string dari assembly game dengan sidecar bawaan, dijaga berdasarkan apa yang dilakukan situs panggilannya sehingga ia tak pernah menerjemahkan nama scene atau parameter animator. Pada build IL2CPP, kode terkompilasi tetap di luar cakupan.
- Teks aset IL2CPP tetap bisa, kok. Kolom string komponen dibaca pada IL2CPP dengan merekonstruksi informasi tipe dari metadata game —
global-metadata.datyang sama seperti yang dibutuhkan hook, dipakai untuk tujuan berbeda. - Ia membaca keluaran XUnity sendiri. Kalau Anda sudah punya
_AutoGeneratedTranslations.txtyang terisi, RuneTranslate mengurai berkas itu dan bisa menerjemahkan nilai di dalamnya, dengan kuncinya tak tersentuh. Kerja yang sudah Anda lakukan tidak dibuang. - Font ditangani saat ekspor, dengan menyuntikkan aset font fallback ke dalam game sehingga bahasa target yang tak pernah dicakup font aslinya tetap terender.
Sembilan penyedia, tiga di antaranya sama sekali tak butuh kunci API — Google, DeepL gratis, dan model Classic/Next-gen DeepL — plus API DeepL, OpenAI, Anthropic, DeepSeek, endpoint apa pun yang kompatibel dengan OpenAI, dan model lokal lewat Ollama atau LM Studio. Tier gratis membuka tiap engine dan tiap penyedia; yang ia batasi adalah throughput dan menahan satu proyek dalam satu waktu. Windows 10/11, atau Linux dan Steam Deck di bawah Wine atau Proton. Diperlukan masuk Patreon gratis saat peluncuran pertama. Keluarannya adalah build terjemahan yang bisa dimainkan dan Anda simpan.
Tak ada pendekatan yang benar secara universal. Game yang seluruh skripnya duduk di satu tabel JSON terbundel adalah pekerjaan level-berkas dan selalu begitu. Game yang menyusun dialognya di dalam kode saat runtime adalah pekerjaan hook dan akan selalu begitu. Mengetahui yang mana yang sedang Anda pegang adalah sebagian besar pekerjaannya.
Ke mana selanjutnya
- Cara menerjemahkan game Unity — panduan lengkapnya, termasuk apa yang dieksternalkan Unity dan apa yang tidak.
- Halaman engine Unity — format yang didukung dan batas saat ini dalam satu tempat.
- RuneTranslate vs XUnity.AutoTranslator — dua pendekatan berdampingan, dengan kasus yang dimenangkan masing-masing.
- Memilih penyedia terjemahan — engine mana yang menangani prosa Jepang dengan baik, dan mana yang tak berbiaya.
- Dasar-dasar glosarium — menjaga nama karakter dan terminologi konsisten di seluruh satu skrip.
- Semua engine yang didukung — kalau ternyata gamenya bukan Unity.
Siap mencoba RuneTranslate?
Tier gratis membuka setiap engine + setiap penyedia terjemahan. Supporter ($3/mo) membuka kecepatan penuh.
Unduh untuk Windows
