EngineHướng dẫnFAQPatreonDiscordTải xuống
Đăng nhập

RuneTranslate · dịch game từ tiếng Nhật và hơn 30 ngôn ngữ

Sản phẩm

  • Tải xuống
  • Engine
  • Chữ trong ảnh
  • Trình sửa tệp lưu
  • Chế độ gian lận
  • Nhật ký thay đổi

Tài nguyên

  • Hướng dẫn
  • So sánh
  • FAQ

Cộng đồng

  • Patreon
  • Discord
  • YouTube
  • Trustpilot

Pháp lý

  • Quyền riêng tư
  • Điều khoản
  • Hoàn tiền
  • Liên hệ
© 2026 RuneTranslate
RuneTranslateTất cả bài viết

unity · textmeshpro · fonts · troubleshooting

Vì sao chữ đã dịch hiện thành ô vuông

Bạn đã dịch game, lần xuất chạy sạch, và hộp thoại đầy □□□. Gần như không bao giờ đó là lỗi bản dịch: đó là lỗi phông chữ, và cách sửa khác với hai lỗi mà người ta hay nhầm với nó. Đây là cách phân biệt glyph bị thiếu, ký tự bị cắt mất và mojibake, và cách sửa từng loại trong Unity, TextMeshPro, Ren'Py và các công cụ chạy trực tiếp.

18 thg 8, 2026·9 phút đọc

Lần xuất đã xong, game đã khởi động, và mỗi dòng hội thoại là một hàng ô chữ nhật rỗng giống hệt nhau. Bản dịch không có gì sai. Văn bản trong file đúng là những gì nhà cung cấp trả về, và nếu bạn mở file đó bằng trình soạn thảo văn bản thì nó đọc đúng. Thứ hỏng là mắt xích cuối cùng: phông chữ mà game đưa cho trình vẽ không có hình để vẽ những ký tự đó.

Ô vuông tofu thật ra là gì

Phông chữ là bảng tra từ codepoint Unicode sang một hình dạng. Khi trình vẽ được yêu cầu vẽ một codepoint mà phông chữ không có, nó thay bằng glyph thiếu của phông chữ, thường là một hình chữ nhật rỗng hoặc có gạch chéo, tên chính thức là .notdef và ở mọi nơi khác được gọi là ô vuông tofu. Một ô vuông là một ký tự mà phông chữ không vẽ được. Cơ chế chỉ có vậy.

Từ đó có hai hệ quả, và cả hai đều hữu ích khi chẩn đoán. Thứ nhất, số ô vuông bằng số ký tự: năm ký tự Thái cho năm ô vuông, không phải một chuỗi loạn ngắn hơn. Thứ hai, chuỗi vẫn nguyên vẹn trong bộ nhớ: game vẫn đo, so sánh, lưu và nạp lại được nó. Chỉ có điểm ảnh là thiếu. Đó là lý do một menu đã dịch có thể hoàn toàn không đọc được mà vẫn điều hướng đúng.

Ba triệu chứng, ba vấn đề khác nhau

Phần lớn sự nhầm lẫn quanh câu “bản dịch của tôi bị hỏng” là do người ta áp cách sửa của loại này cho loại khác. Hãy đọc hình dạng của hư hại trước khi thay đổi bất cứ thứ gì.

  • Ô vuông □□□: ký tự đúng, phông chữ không vẽ được. Sửa phông chữ.
  • ????: ký tự đã mất. Có thứ gì đó mã hóa lại chuỗi sang bộ ký tự hẹp hơn và thay mọi thứ nó không biểu diễn được. Không phông chữ nào đưa chúng về được. Hãy sửa bảng mã, hoặc chọn ngôn ngữ đích mà định dạng chứa được.
  • Chữ Latin loạn như テキスト, hoặc テキスト hiện thành テキスト: mojibake. Byte đúng, bộ giải mã sai: văn bản được ghi bằng một bảng mã đang bị đọc như bảng mã khác. Hãy sửa bảng mã đang được dùng để đọc.

Cách tách nhanh: ô vuông và mojibake đều giữ số byte xấp xỉ tỉ lệ với bản gốc, nhưng mojibake cho ra các ký tự rác nhìn thấy được, đa dạng, còn tofu cho ra các hình chữ nhật giống hệt nhau, đồng đều. Đồng đều nghĩa là “phông chữ”. Đa dạng nghĩa là “bảng mã”.

Ô vuông: thiếu glyph

Game được phát hành cùng một phông chữ chỉ phủ những gì nó cần. Không khâu nào trong chuỗi bị hỏng: bạn yêu cầu một codepoint mà người thiết kế chưa bao giờ đưa vào. Cách sửa luôn là đưa cho trình vẽ một phông chữ có glyph đó, bằng cách thay phông chữ hoặc thêm một phông dự phòng để trình vẽ tham khảo khi phông chính trống.

Dấu hỏi: ký tự đã bị bỏ

Khi một chuỗi phải được ghi lại vào định dạng lưu văn bản bằng bảng mã đời cũ một hoặc hai byte, mọi ký tự nằm ngoài bảng mã đó phải biến thành một thứ gì đó. Theo quy ước, thứ đó là ?. Shift-JIS và cp932 chứa được tiếng Nhật, ASCII và rất ít thứ khác; một trường ASCII chặt chẽ không chứa được chữ Hy Lạp, Cyrillic, Thái hay CJK nào. Đây là đặc tính của định dạng file, không phải của phông chữ, và nó xảy ra lúc xuất: đến khi game đọc file thì thông tin đã mất rồi.

RuneTranslate có một engine mà đây là giới hạn đang có hiệu lực, và nó được nói rõ chứ không giấu: YU-RIS mã hóa lại chuỗi sang cp932, thân thiện với tiếng Anh và các đầu ra Latin khác nhưng biến tiếng Thái thành ?. Các ngôn ngữ đích ngoài cp932 trên engine đó cần một cách xử lý phông chữ chưa được xây dựng.

Chữ Latin loạn: mojibake

Văn bản tiếng Nhật ghi bằng Shift-JIS rồi đọc như UTF-8 (hoặc ngược lại) cho ra những chuỗi dài chữ Latin có dấu và ký tự vẽ khung. Điều này xuất hiện khi một công cụ ghi file bằng sai bảng mã, hoặc khi trình nạp của chính game giả định một bảng mã mà bản xuất của bạn không dùng. Cách sửa là ghi file bằng bảng mã mà engine mong đợi, không bao giờ là đổi phông chữ, vì đổi cũng không thay đổi gì.

Vì sao CJK và tiếng Thái bị nặng nhất

Chữ Latin cần khoảng một trăm glyph. Tiếng Nhật cần vài nghìn, tiếng Trung nhiều hơn. File phông chữ lớn, và game đi kèm bản nhỏ nhất đủ phủ chữ viết của chính nó, nên độ phủ bạn thừa hưởng hoàn toàn phụ thuộc vào ngôn ngữ mà game được làm cho.

  • Game làm cho tiếng Nhật thường mang kana, kanji thông dụng và ASCII. Dịch sang tiếng Nga, Hy Lạp, Thái hay Hàn thì mọi ký tự ngoài ASCII đều rơi khỏi phạm vi.
  • Game làm cho tiếng Anh thường chỉ mang Latin, nên tiếng Nhật, Trung, Hàn, Thái, Hy Lạp và Cyrillic đều hỏng cùng lúc.
  • Tiếng Thái là trường hợp tệ nhất trong thực tế: nó nằm ngoài mọi phông chữ game thông dụng, và còn cần các dấu nguyên âm và dấu thanh kết hợp đặt phía trên và dưới ký tự gốc, nên phông chữ về mặt kỹ thuật có đủ codepoint vẫn có thể hiển thị nó rất tệ.
  • Chữ Latin không tự động an toàn. Tiếng Ba Lan, Séc, Hungary, Thổ Nhĩ Kỳ, Việt và Romania dùng các ký tự Latin mở rộng mà phông chữ làm cho tiếng Anh hay tiếng Nhật thường bỏ sót. RuneTranslate đóng gói một phông chữ rộng hơn đúng cho những ngôn ngữ đích đó trên Ren'Py, vì “Latin thì ổn” hóa ra là sai.

Riêng với Unity và TextMeshPro

Unity có hai hệ thống văn bản và chúng hỏng theo cách khác nhau. Text uGUI cũ dùng đối tượng Font. TextMeshPro, thứ mà hầu hết game hiện đại dùng, hoàn toàn không dùng file phông chữ lúc chạy. Nó dùng TMP font asset: một atlas texture gồm các hình glyph vẽ sẵn cùng bảng ánh xạ codepoint sang vị trí trong atlas đó.

Vì vậy một TMP font asset có bộ ký tự cố định. Khi nhà phát triển tạo nó, họ chọn một dải ký tự, thường chỉ là ngôn ngữ họ phát hành, và TMP đúc đúng các glyph đó vào atlas. Một font asset tĩnh không bao giờ vẽ được thứ gì ngoài bộ đó, dù bạn đưa gì vào. Một font asset động giữ tham chiếu đến file phông chữ nguồn và có thể vẽ glyph mới theo yêu cầu, đó là chế độ duy nhất có thể mở rộng để phủ một ngôn ngữ mà nhà phát triển chưa từng nghĩ tới.

Lối thoát của TMP là danh sách dự phòng. Mỗi font asset có danh sách m_fallbackFontAssets, và TMP Settings có một danh sách dự phòng toàn cục; khi asset chính không có glyph cho một codepoint, TMP duyệt các danh sách đó để tìm asset có. Đây là chỗ đúng để can thiệp, vì nó để phông chữ của chính game tiếp tục lo mọi thứ nó đã vẽ được: giao diện giữ nguyên diện mạo định sẵn và chỉ những ký tự nó không xử lý được mới lấy từ nơi khác.

Sửa bằng công cụ chạy trực tiếp

XUnity.AutoTranslator hook vào game khi nó chạy và có thể đổi phông chữ từ file cấu hình. Các thiết lập liên quan, trong mục [Behaviour]:

  • OverrideFont: thay phông chữ dùng bởi các thành phần Text của Unity UI cũ. Nhận tên một phông chữ mà game hoặc hệ điều hành tìm được.
  • OverrideFontTextMeshPro: thay hẳn TMP font asset. Trỏ nó đến một file AssetBundle phông chữ TMP, hoặc tên một asset mà game đã có.
  • FallbackFontTextMeshPro: an toàn hơn trong hai cách: thêm một phông chữ mà TMP chỉ tham khảo cho những glyph asset của game còn thiếu, giữ nguyên kiểu chữ gốc ở mọi chỗ khác.
  • tmp_font_assetbundles: bộ sưu tập do cộng đồng duy trì gồm các AssetBundle phông chữ TMP dựng sẵn, thứ mà OverrideFontTextMeshPro và FallbackFontTextMeshPro thường được trỏ tới. Chúng được dựng theo từng phiên bản Unity, và bundle dựng cho phiên bản Unity khác với game sẽ không nạp được; khớp phiên bản là bước người ta hay bỏ sót.

Công cụ chạy trực tiếp áp dụng theo từng máy và từng cấu hình: nó sửa game trên PC cài nó, và ai khác chạy bản dựng đó cần cùng thiết lập. RuneTranslate đọc và ghi được file _AutoGeneratedTranslations.txt của chính plugin, nên dự án đang dùng nó không phải ngõ cụt. Xem phần so sánh để biết mỗi cách hợp ở đâu.

Sửa ở cấp file

RuneTranslate đi thẳng vào đường dự phòng ngay trong dữ liệu của game. Khi xuất Unity, nó tìm TMP Settings của game, một font asset dùng làm mẫu và một phông chữ, rồi dựng một TMP font asset mới ở chế độ Dynamic quanh một phông chữ đóng gói sẵn phủ được chữ viết đích và thêm nó vào danh sách dự phòng. Các mục dự phòng có sẵn được giữ nguyên, và phông chữ của chính game vẫn là chính, nên game Nhật dịch sang tiếng Thái giữ kiểu dáng gốc cho mọi thứ là Latin và lấy glyph Thái từ asset được chèn vào.

Hai lưu ý thẳng thắn. Nó cần TMP Settings của game và một TextMeshPro font asset dùng được làm mẫu, nhưng chúng không còn phải nằm cùng nhau: TMP Settings, mẫu và một Font có thể ở các file asset khác nhau hoặc trong một data.unity3d đóng gói. Game bố trí phông chữ theo cách khác vẫn có thể nằm ngoài phạm vi. Và khi việc chèn bị bỏ qua, lần xuất nói rõ điều đó trong cảnh báo thay vì kết thúc báo xanh: một bản xuất ra toàn ô vuông không được trông giống hệt bản chạy tốt. Nếu bạn thấy cảnh báo đó, đường dùng công cụ chạy trực tiếp ở trên là phương án dự phòng.

Ren'Py đạt cùng kết quả bằng cơ chế khác, vì Ren'Py không có TMP: RuneTranslate đóng gói một phông chữ CJK hoặc không phải Latin vào bản dựng đã xuất và trỏ các phông chữ của game sang nó (kể cả các nhóm phông chữ mà game tự dựng), để engine thay nó vào bất cứ chỗ nào phông chữ của game không đủ.

Danh sách kiểm tra

  1. Nhìn hư hại. Hình chữ nhật đồng đều, ký tự ?, hay chữ loạn: hãy xác định bạn gặp loại nào trong ba loại trước khi đụng vào gì.
  2. Nếu là ?, mở file đã xuất. Nếu dấu hỏi nằm trong file thì ký tự đã mất lúc ghi và phông chữ nào cũng không giúp được; hãy kiểm tra bảng mã chuỗi của engine có chứa được ngôn ngữ đích của bạn không.
  3. Nếu là chữ loạn, hãy kiểm tra bảng mã mà engine mong đợi cho file đó thay vì phông chữ.
  4. Nếu là ô vuông, xác nhận nội dung file đúng (gần như luôn đúng) và coi đó là việc về phông chữ.
  5. Trên Unity, nên thêm phông dự phòng thay vì thay phông chữ của game. Thay thế đổi diện mạo của mọi chuỗi, kể cả những chuỗi đang hiển thị tốt.
  6. Nếu dùng AssetBundle phông chữ TMP, hãy khớp nó với phiên bản Unity của game.
  7. Xuất lại và kiểm tra những ký tự cụ thể từng lỗi, không chỉ dòng hội thoại đầu tiên. Ký tự Latin mở rộng và dấu tiếng Thái thường qua được lần kiểm tra mẫu mà hỏng ở chỗ khác.

Đi tiếp đến đâu

Để biết quy trình Unity đầy đủ, tức Unity thật sự cho truy cập văn bản nào và cái gì nằm ngoài tầm với, hãy đọc cách dịch game Unity và trang engine Unity. Chữ vẽ trong ảnh thay vì trong dữ liệu là vấn đề riêng với công cụ riêng: xem dịch ảnh. Còn FAQ bao quát những bất ngờ thường gặp khác ở lần dùng đầu.

RuneTranslate miễn phí để dùng, mở khóa mọi engine và mọi nhà cung cấp trừ RuneLingua, trong đó có bốn nhà không cần khóa API. Nó phân tích file của chính game và xuất bản dựng đã dịch, chơi được, mà bạn giữ. Tải xuống hoặc xem các engine được hỗ trợ.

RuneTranslate

Gói miễn phí mở khóa mọi engine và mọi nhà cung cấp dịch trừ RuneLingua. Supporter ($3.99/tháng) mở khóa tốc độ tối đa.

Tải RuneTranslate cho Windows & Linux

Bài liên quan

unity · xunity-autotranslator · troubleshooting · 18 thg 8, 2026 · 9 phút

XUnity.AutoTranslator không dịch được

Đọc →
unity · tutorial · engine · 9 thg 6, 2026 · 6 phút

Cách dịch game Unity sang tiếng Anh

Đọc →
troubleshooting · workflow · export · exclusions · 29 thg 8, 2026 · 11 phút

Game đã dịch không khởi động? Tìm dòng gây lỗi

Đọc →

Sẵn sàng thử RuneTranslate?

Gói miễn phí mở khóa mọi engine và mọi nhà cung cấp dịch trừ RuneLingua. Supporter ($3.99/tháng) mở khóa tốc độ tối đa.

Tải cho Windows & Linux