Kiến thức Phần mềm

XUnity AutoTranslator: dịch game Unity và lỗi phông Việt

XUnity AutoTranslator dịch giao diện game Unity ngay lúc chạy. Bài nói rõ cách nạp, các nguồn dịch, cách sửa lỗi ô vuông tiếng Việt. Kiểm 9/2026.

  • autocad123.vn
  • 10/10/2024

XUnity AutoTranslator là bản mod dịch tự động cho game làm bằng Unity. Nó chèn vào tiến trình game đang chạy, chặn các chuỗi chữ trước khi chúng hiện lên màn hình, gửi đi dịch rồi vẽ lại. Mọi thông tin trong bài kiểm tháng 9/2026.

Phần lớn hướng dẫn tiếng Việt về công cụ này chỉ dừng ở khâu giải nén và sửa hai dòng trong tệp cấu hình. Chỗ người Việt thật sự mắc kẹt lại nằm sau đó: bản dịch chạy được nhưng hiện ra một dãy ô vuông. Bài này giải thích vì sao, và nói rõ khi nào thì không nên đụng vào công cụ này.

Tóm tắt. Kho mã chính chủ là github.com/bbepis/XUnity.AutoTranslator, giấy phép MIT, mở từ tháng 4/2018 và vẫn còn được cập nhật. Bản phát hành mới nhất là v5.6.1 ra ngày 19/4/2026. Công cụ nạp vào game qua BepInEx, MelonLoader, IPA, UnityInjector, hoặc chạy độc lập bằng ReiPatcher. Lỗi ô vuông của tiếng Việt là do bảng phông thiếu dải Unicode U+1EA0 đến U+1EF9, sửa bằng OverrideFont nếu game dùng UGUI và FallbackFontTextMeshPro nếu game dùng TextMeshPro. Đây là công cụ can thiệp tiến trình, chỉ nên dùng với game chơi đơn.

XUnity AutoTranslator là gì và ai đang giữ mã nguồn

Đây là một plugin mã nguồn mở do người dùng có bí danh Bepis khởi tạo. Kho mã đặt trên GitHub từ ngày 29/4/2018 và tính đến đầu tháng 9/2026 vẫn nhận thay đổi, lần đẩy mã gần nhất là ngày 31/8/2026. Kho có khoảng 3.380 lượt gắn sao và hơn 360 bản rẽ nhánh.

Giấy phép là MIT. Nghĩa là bạn được dùng, sửa và phát hành lại phần mã của plugin, miễn giữ lại thông báo bản quyền. Xin lưu ý ngay tại đây: giấy phép đó nói về plugin, không nói gì về văn bản trong game bạn dịch. Hai chuyện tách bạch nhau, phần cuối bài quay lại điểm này.

Bản phát hành mới nhất khi bài viết là v5.6.1, ngày 19/4/2026. Mỗi bản phát hành đóng gói thành nhiều tệp nén khác nhau tuỳ cách nạp: BepInEx, BepInEx-IL2CPP, MelonMod, MelonMod-IL2CPP, IPA, ReiPatcher, UnityInjector và một gói dành cho người viết plugin. Tải nhầm gói là lỗi hay gặp nhất ở lần đầu.

Nó chèn vào game bằng cách nào

Công cụ không sửa tệp gốc của game. Nó nạp một thư viện vào tiến trình game lúc chạy, rồi móc vào các thành phần hiển thị chữ của Unity. Việc nạp đó cần một trình nạp mod đứng ra làm trung gian.

Cách nạpCần gì trướcGhi chú
BepInExCài BepInEx trướcKho mã ghi rõ đây là cách được khuyến nghị
MelonLoaderCài MelonLoader trướcTệp nằm ở thư mục Mods và UserLibs
IPACài IPA trướcTrình nạp cũ, ít game còn dùng
UnityInjectorCài UnityInjector trướcCó gói riêng, nhưng không dùng được móc MonoMod
ReiPatcherKhông cần gì thêmChạy độc lập, nhưng đừng dùng nếu game đã có trình nạp khác

Dòng cuối bảng đáng chú ý. Kho mã ghi thẳng rằng nếu game đã dùng một trình nạp được hỗ trợ thì phải tránh cách ReiPatcher, vì hai bên sẽ đá nhau. Nhiều người cài chồng cả hai rồi ngồi gỡ lỗi vô ích.

Tệp cấu hình sinh ra ở lần chạy đầu tiên, không có sẵn trong gói tải về. Chỗ đặt tệp phụ thuộc cách nạp. Với BepInEx, tệp tên là AutoTranslatorConfig.ini nằm trong thư mục BepInEx\config. Với các cách còn lại, tệp tên là Config.ini nằm trong thư mục AutoTranslator ngay tại gốc thư mục game.

Đường đi của một câu chữ trong game 1. Game vẽ một chuỗi chữ ra màn hình UGUI, NGUI, TextMeshPro, IMGUI, Utage 2. Plugin móc lấy chuỗi rồi chờ một giây Chuỗi còn đổi thì chưa gửi đi đâu cả 3. Tra bộ nhớ đệm nằm trên đĩa _AutoGeneratedTranslations.txt 4. Chưa có thì gửi ra Internet Google, DeepL, Bing, Papago, Baidu 5. Vẽ lại bằng phông đã cấu hình Phông thiếu dấu là ra ô vuông ở đây

Hình 1. Năm bước một câu chữ đi qua. Bước 3 là lý do bạn nên giữ lại tệp đệm: chơi lại lần sau sẽ không tốn thêm lần gọi mạng nào.

Mono và IL2CPP là hai thế giới khác nhau

Unity có hai cách dựng phần mã của game. Kiểu Mono để lại tệp Assembly-CSharp.dll đọc được. Kiểu IL2CPP biên dịch sang mã máy, gói vào GameAssembly.dll, và mọi thứ khó hơn hẳn.

XUnity AutoTranslator có hỗ trợ IL2CPP, nhưng chính kho mã nói thẳng là chưa đầy đủ. Khả năng móc chữ kém hơn nên nhiều đoạn phải làm mới thủ công. Tuỳ chọn TextGetterCompatibilityMode không dùng được. Bản dịch riêng theo từng plugin và phần IMGUI cũng chưa hỗ trợ. Với IL2CPP bạn phải dùng BepInEx 6 hoặc MelonLoader kèm đúng gói có chữ IL2CPP trong tên.

Chọn cách nạp theo kiểu dựng của game Game dựng bằng Mono hay IL2CPP? Mono, phổ biến hơn Có Assembly-CSharp IL2CPP Có GameAssembly.dll BepInEx 5 hoặc MelonLoader, IPA, ReiPatcher BepInEx 6 hoặc MelonLoader, gói tên có IL2CPP Game đã có sẵn trình nạp mod? Có thì đừng chọn ReiPatcher nữa. Kho mã ghi rõ hai bên sẽ gây lỗi cho nhau.

Hình 2. Nhánh phải khó hơn nhánh trái nhiều. Nếu thấy GameAssembly.dll trong thư mục game, hãy chuẩn bị tinh thần là vài tính năng sẽ không chạy.

Các nguồn dịch và mức phí

Mỗi nguồn dịch là một tệp phụ nằm trong thư mục Translators. Bạn chọn nguồn bằng dòng Endpoint trong tệp cấu hình, mặc định là GoogleTranslate. Ngoài ra có dòng FallbackEndpoint để tự chuyển sang nguồn dự phòng khi nguồn chính hỏng.

NguồnCần khoá khôngKho mã ghi gì
GoogleTranslateKhôngKhông giới hạn nhưng không ổn định
DeepLTranslateKhôngKhông ổn định, nhưng chất lượng đáng chú ý
BingTranslateKhôngKhông giới hạn nhưng không ổn định
PapagoTranslateKhôngKhông giới hạn nhưng không ổn định
BaiduTranslateCó, AppId và AppSecretMiễn phí một mức rồi tính tiền
YandexTranslateMiễn phí tới một triệu ký tự mỗi ngày
WatsonTranslateMiễn phí tới một triệu ký tự mỗi tháng
Các bản có đuôi LegitimateDùng đúng API trả tiền của hãng
ezTrans XP, LecPowerTranslator15KhôngNhưng phải cài sẵn phần mềm dịch đó

Có một cảnh báo trong kho mã mà ít hướng dẫn nào nhắc lại: các nguồn không cần khoá có thể ngừng chạy bất cứ lúc nào. Chúng dựa vào giao diện web công khai chứ không phải hợp đồng nào cả. Hôm nay chạy, tuần sau hỏng là chuyện bình thường.

Plugin cũng tự bảo vệ để khỏi bắn quá nhiều yêu cầu. Nó chờ một giây trước khi gửi, không gửi hai yêu cầu cùng lúc, giới hạn 8000 yêu cầu mỗi phiên chơi, và tự tắt nếu nguồn dịch trả về rỗng năm lần liên tiếp. Khi plugin đã tự tắt, phím ALT+Q dùng để bật lại.

Chữ tiếng Việt hiện thành ô vuông: vì sao và sửa ở đâu

Đây là vướng mắc lớn nhất của người Việt khi dùng công cụ này, và nó không phải lỗi của plugin. Plugin dịch xong đúng, nhưng phông chữ trong game không có sẵn hình dạng cho các ký tự có dấu, nên chỗ đó vẽ ra một ô vuông rỗng.

Nguyên nhân kỹ thuật nằm ở chỗ chữ Việt trải trên bốn khối Unicode chứ không gom một chỗ. Các dấu quen thuộc như â, ê, ô nằm ở khối Latin-1 Supplement. Chữ ă và đ nằm ở Latin Extended-A. Chữ ơ và ư nằm ở Latin Extended-B. Riêng chín mươi ký tự nặng dấu nhất, tức bốn mươi lăm cặp chữ hoa và chữ thường, nằm gọn ở khối Latin Extended Additional, đúng dải U+1EA0 đến U+1EF9.

Bảng phông dựng cho tiếng Trung hay tiếng Nhật thường có Basic Latin cộng khối chữ Hán, và bỏ qua đúng cái dải U+1EA0 đến U+1EF9 đó. Vì vậy có người đổi phông năm bảy lần vẫn thấy ô vuông: họ đổi sang một bảng phông cũng không chứa dấu tiếng Việt. Kho mã có sẵn vài gói bảng phông trong mục phát hành, nhưng chính kho ghi là chúng chưa được kiểm kỹ.

Chữ Việt ra ô vuông thì sửa ở đâu Bản dịch hiện ra một dãy ô vuông Phông trong game không có dấu tiếng Việt Game dùng TextMeshPro FallbackFontTextMeshPro = tên tệp bundle đặt ở thư mục gốc của game Game dùng UGUI OverrideFont = tên phông cài trong Windows, ví dụ Arial hay Tahoma, không phải đường dẫn Đổi rồi mà vẫn ô vuông Bảng phông thiếu dải U+1EA0 đến U+1EF9, phải tự dựng bảng phông cho đúng game

Hình 3. Ba nhánh xử lý. Nhánh dưới cùng là chỗ hầu hết hướng dẫn tiếng Việt bỏ qua, nên người đọc cứ loay hoay đổi tên phông mãi.

Về mặt cấu hình, có ba tuỳ chọn và chúng không thay thế nhau được:

Tuỳ chọnDùng choGiá trị nhận vào
OverrideFontChỉ UGUITên một phông đã cài trong hệ điều hành
OverrideFontTextMeshProChỉ TextMeshProTên tệp bundle, tên phông hệ thống, hoặc đường dẫn tài nguyên
FallbackFontTextMeshProChỉ TextMeshProNhư trên, nhưng chỉ dùng khi thiếu ký tự

Điểm dễ sai nhất nằm ở dòng đầu. Trong mã nguồn, OverrideFont được đưa thẳng vào hàm CreateDynamicFontFromOSFont của Unity. Nghĩa là nó chờ một cái tên phông của hệ điều hành, không phải đường dẫn tới tệp .ttf. Viết đường dẫn vào đó thì không có gì xảy ra và cũng không có báo lỗi rõ ràng.

Với TextMeshPro thì kho mã khuyên dùng FallbackFontTextMeshPro thay vì OverrideFontTextMeshPro, vì bản dự phòng chỉ nhảy vào khi gặp ký tự thiếu, giữ nguyên phông gốc cho phần còn lại. Nếu phải tự dựng bảng phông, bạn phải dựng nó bằng đúng phiên bản Unity Editor mà game dùng, rồi đóng thành asset bundle. Kho mã có một trang wiki riêng cho việc này.

Mẹo kiểm nhanh. Sau khi đặt OverrideFont, bấm ALT+F trong game để bật tắt qua lại giữa phông thay thế và phông gốc. Nếu bấm mà không thấy gì đổi, nghĩa là game không vẽ chữ bằng UGUI, và bạn phải chuyển sang nhóm tuỳ chọn của TextMeshPro.

Giới hạn thật của dịch máy trong game

Cần nói thẳng: kết quả là dịch máy, không phải bản Việt hoá. Chất lượng đủ để hiểu cốt truyện ở mức thô, và tụt hẳn ở những chỗ cần ngữ cảnh. Câu ngắn không có chủ ngữ, cách xưng hô, tên riêng viết bằng chữ Hán, lời thoại nói lửng đều dễ ra sai nghĩa.

Có một giới hạn máy móc nữa. Tuỳ chọn MaxCharactersPerTranslation mặc định là 200 ký tự, và mọi đoạn dài hơn mức đó bị bỏ qua chứ không cắt ra dịch từng phần. Tài liệu của kho mã ghi hai mức trần khác nhau cho tuỳ chọn này, một chỗ nói tối đa 1000 và một chỗ nói 2500, nên đừng tin con số trần mà hãy thử.

Cách bù đắp là sửa tay. Mọi bản dịch máy đều được ghi vào tệp _AutoGeneratedTranslations.txt. Bạn mở tệp đó, sửa các câu quan trọng, bấm ALT+R trong game là nạp lại ngay. Bản dịch bạn đặt ở tệp .txt khác trong cùng thư mục sẽ được ưu tiên hơn tệp máy sinh.

Khi nào nên dùng XUnity AutoTranslator và khi nào không

Đây là phần quan trọng nhất của bài, và cũng là phần các hướng dẫn khác hay bỏ qua hẳn.

Nên dùng khi bạn chơi một game chơi đơn, ngoại tuyến, không có tài khoản gắn liền, và bản gốc không có ngôn ngữ bạn đọc được. Đó là đúng bối cảnh mà công cụ này sinh ra để phục vụ.

Không nên dùng trong ba tình huống dưới đây. Cả ba đều là ranh giới bạn tự chịu trách nhiệm, không phải lỗi của XUnity AutoTranslator.

Tình huốngRủi roVì sao
Game nhiều người chơi, có tài khoảnBị khoá tài khoảnĐiều khoản của nhiều game cấm mọi can thiệp vào tiến trình, không phân biệt mục đích
Game có phần mềm chống gian lậnBị đá khỏi phiên, có khi bị đánh dấuNạp thư viện vào tiến trình là hành vi giống hệt công cụ gian lận nhìn từ phía bộ phát hiện
Định phát tán gói dịch ra ngoàiVi phạm bản quyềnBản dịch là tác phẩm phái sinh từ kịch bản game, giấy phép MIT của plugin không cho bạn quyền đó

Về điểm thứ hai, đáng nói cho công bằng: các hãng chống gian lận lớn thường tuyên bố họ chỉ cấm với công cụ gian lận thật sự, và có thể chỉ đá bạn khỏi phiên chơi chứ không đánh dấu. Nhưng đó là chính sách của hãng chống gian lận, còn quyết định cuối cùng nằm ở nhà phát hành game. Bạn không có cách nào biết trước, nên đơn giản là đừng thử.

Về điểm thứ ba, cần tách bạch cho rõ. Kho mã khuyến khích bạn phát hành lại plugin kèm tệp dịch để đỡ gọi mạng, và đưa ra vài quy tắc kỹ thuật cho việc đó. Nhưng đó là ý kiến của tác giả plugin về phần mã của chính họ. Kịch bản, lời thoại và tên nhân vật trong game thương mại vẫn thuộc về nhà phát hành. Dùng riêng cho mình là một chuyện, đăng gói dịch lên mạng cho người khác tải là chuyện khác hẳn.

Về nguồn tải. Chỉ tải từ mục phát hành của kho mã chính chủ trên GitHub. Các trang phát gói dịch kèm sẵn plugin thường đóng gói thêm thứ khác, và bạn không có cách kiểm tra. Plugin này chạy bên trong tiến trình game với đầy đủ quyền của tiến trình đó.

Lỗi thường gặp

Hiện tượngNguyên nhân hay gặpVì sao
Không thấy tệp cấu hình đâuChưa chạy game lần nàoTệp chỉ sinh ra ở lần khởi động đầu tiên
Bấm ALT+0 không ra bảng nàoBấm phím O thay vì số 0Kho mã phải ghi chú riêng vì lỗi này quá phổ biến
Chữ vẫn nguyên tiếng gốcGame dùng khung chữ đang tắtIMGUI và TextMesh mặc định tắt, phải tự bật trong tệp cấu hình
Dịch được một lúc rồi ngừng hẳnPlugin tự tắt để chống spamNguồn dịch trả rỗng nhiều lần liên tiếp, sửa xong thì bấm ALT+Q
Menu dịch được, thoại thì khôngHook mặc định không bắt đượcThử bấm ALT+U để móc thủ công tại màn hình đó
Đổi phông mà chữ vẫn ô vuôngĐặt sai nhóm tuỳ chọnOverrideFont không có tác dụng với game dùng TextMeshPro
Game đứng hình khi bản dịch hiện raGame đọc lại chính chuỗi chữ để xử lýBật TextGetterCompatibilityMode, nhưng chỉ chạy với Mono

Câu hỏi thường gặp

XUnity AutoTranslator có cần mạng không?

Có, trừ khi bạn dùng nguồn dịch chạy ngoại tuyến. Kho mã nói thẳng ở phần mở đầu rằng plugin đi ra Internet, và nếu bạn không thoải mái với điều đó thì đừng dùng. Từ lần chơi thứ hai trở đi thì đỡ hơn nhiều nhờ bộ nhớ đệm.

Dịch sang tiếng Việt được không?

Được, đổi dòng Language trong tệp cấu hình thành vi. Chất lượng phụ thuộc nguồn dịch bạn chọn, và cặp Nhật sang Việt thường kém hơn Nhật sang Anh vì các dịch vụ dịch được huấn luyện nhiều hơn cho cặp thứ hai. Nhiều người chọn đích là tiếng Anh cho dễ đọc hơn.

Có làm hỏng tệp game không?

Cách nạp qua BepInEx, MelonLoader hay IPA không sửa tệp gốc, chỉ thêm tệp mới vào thư mục game. Cách ReiPatcher thì có vá tệp, nên hãy sao lưu thư mục game trước. Muốn gỡ bỏ hoàn toàn ở bản BepInEx thì xoá thư mục XUnity.AutoTranslator trong plugins, nhưng giữ lại thư mục XUnity.ResourceRedirector vì mod khác có thể đang cần.

Còn cách nào khác không dùng mod?

Có, và với game trực tuyến thì đó là cách duy nhất an toàn. Bạn chụp màn hình rồi dịch bằng công cụ dịch ảnh, hoặc dùng phần mềm đọc chữ trên màn hình ở cửa sổ riêng. Chậm hơn nhiều, nhưng không đụng gì vào tiến trình game nên không có rủi ro tài khoản.