
Nhân dịp fanpage đổi tên miền, đồng thời dạo này thấy có nhiều dự án nổi lên nên tiện thể viết thêm bài hướng dẫn này, coi như bổ sung một số chỗ chưa được đề cập chi tiết trong http://hako.re/forum/16-huong-dan/974-guide-nhung-dieu-can-biet-khi-lap-pj-dich-vn.html, cụ thể là về phần Tech.
I. Những điều cơ bản
1. Tool
Như được đề cập trong bài hướng dẫn cũ, tool là thứ không thể thiếu trong việc dịch một bộ VN. Tool có nhiều loại và có thể được tìm ở nhiều nguồn khác nhau, mình xin nhắc lại một số nguồn cơ bản:
Hiện tại đã có rất nhiều tool để extract data nhưng tool đóng gói (compiler) thì lại rất ít. Rất may là nhiều engine có hỗ trợ đọc data ngay trong folder game mà không phải qua khâu đóng gói nên nếu bạn không quan tâm đến việc tỏ ra "chuyên nghiệp" thì có thể bỏ qua công đoạn này.
2. Encoding
Khái niệm Encoding có thể được tìm ở nhiều nơi, có thể hiểu đơn giản là bảng mã mà engine dùng để hiển thị các kí tự.

Unikey.
Với các engine Nhật, encoding thường được sử dụng là Shift-JIS, rất đáng tiếc là nó không hỗ trợ tiếng Việt nên làm việc trên các engine này rất khó khăn. Vậy nên nếu bạn muốn solo một dự án nào đó mà không cần động nhiều đến phần tech thì tốt nhất là nên tìm một engine hỗ trợ Unicode hay UTF-8 như KiriKiri hay (O)NScripter để làm.
II. Kỹ thuật nâng cao
Như đã nói ở trên, có một số engine phức tạp cần phải qua xử lý mới hoạt động được như ý, đây sẽ là phần để giải quyết chúng và các vấn đề thường gặp khác.
1. Sửa font
a. TCVN3
Trước khi vào việc chính, mình xin nói thêm về bảng mã TCVN3 (Tiêu Chuẩn Việt Nam 3). Đã bao giờ bạn thắc mắc vì sao lại sinh ra thêm một bảng mã riêng cho tiếng Việt mà không dùng các bảng mã khác như Unicode hay UTF-8 chưa? Lí do chính là vận dụng việc sửa font để hiện thị tiếng Việt trên các nền tảng không hỗ trợ.

Font .VnArial trong FontForge.
Có thể thấy, những kí tự đặc biệt đã được thay bằng các chữ cái tiếng Việt. Nhưng cũng có một điều khác đáng chú ý đó là... không gồm các chữ in hoa. Đúng vậy, trong bảng mã TCVN3, muốn hiển thị các chữ in hoa có dấu như Ắ Ớ thì phải... dùng font khác, cụ thể là thêm chữ H sau tên font (.VnArial -> .VnArialH). Lí do của việc này là số kí tự có thể thay đổi bị giới hạn.
"Tiếng Nhật có cả nghìn chữ sao mà không đủ?", để trả lời cho câu hỏi này, xin mời đọc tiếp phần dưới.
b. Half-width và Full-width
Half-width và Full-width là thuộc tính chỉ độ rộng của một kí tự, có thể xem qua video bên dưới để thấy rõ hơn:
Trong bản demo trên, những chữ cái tiếng Việt sau khi được sửa trông rất lệch lạc, đây là kết quả của việc sửa font trên các kí tự Full-width mà không chỉnh lại độ rộng (Chỉnh lại được không thì mình không rõ, nhưng nếu engine đã hard code độ rộng rồi thì khá là khó). Những chữ cái không dấu khác vẫn hiển thị bình thường vì chúng là các kí tự Half-width.
Vậy chúng ta cần bao nhiêu kí tự Half-width để có thể nhét vừa bảng chữ cái tiếng Việt vào? Bỏ qua 48 chữ cái aA -> zZ cơ bản (mình tính cả vài chữ tiếng Anh nữa), tiếng Việt còn có thêm 134 chữ cái nữa, tính riêng chữ cái không hoa là 67. Vậy nhiệm vụ đầu tiên cần phải làm là tìm chỗ để nhét 67 chữ cái kia vào.
Lưu ý là bình thường chỉ dùng được Half-width kana thôi chứ không dùng được Half-width hira nhé. Những chữ hiragana nhỏ thường dùng trông vậy thôi nhưng đều tính là Full-width, vì vậy độ rộng của chúng là như nhau khi hiển thị trong game (つっ). Sau khi tính toán lấp đầy bảng Half-width kana thì còn thiếu hơn chục chữ nữa, hi sinh dàn chữ số và một số kí tự đặc biệt nữa (tùy ý) là coi như đủ.
Tiếp đến là những chữ in hoa có dấu, cái này thì đơn giản hơn. Dấu cách + Half-width = Full-width. Và đầu câu mới phải viết hoa nên sẽ không gặp nhiều trở ngại, chỉ cần đẩy chữ sang bên phải là được. (Nhớ thêm lại chữ số và kí tự đặc biệt đã hi sinh bên trên)
c. Code replace
Phần này cũng quan trọng chẳng kém, một khi đã sửa font thì tức là đã có một bảng mã riêng. Với số lượng chữ cái cần thay trên 134 thì chắc chẳng ai muốn replace thủ công cả. (Nếu ai biết tool nào phục vụ việc này thì tốt quá)
*Code thì mạnh ai nấy làm, phần này và cả những phần sau nữa chỉ mang tính chất tham khảo.
Điều đầu tiên cần làm là lập ra một bảng quy tắc. Quy tắc của mình là chữ đứng sau thay cho chữ đứng trước.
Ví dụ về bảng quy tắc.
Tiếp theo là áp nó vào code. Ngôn ngữ mình sử dụng là Ruby (RGSS3).
Một câu ví dụ:
Code replace:
Mỗi engine lưu trữ text một cách khác nhau nên mình chỉ làm ví dụ vậy thôi, xử lý thêm một vài vấn đề nữa như chữ hoa đầu câu hay word wrap,... là sẽ được thành quả.
Ethornell Engine (BGI).

Ví dụ về bảng quy tắc.
Tiếp theo là áp nó vào code. Ngôn ngữ mình sử dụng là Ruby (RGSS3).
PHP:
quytac = 'ă[ĂつâナÂなêヒÊばôムÔふơラƠほưンƯめđ+Đるắ*ẮづấニẤにếフẾぱốメỐぶớリỚぼứ#ỨもáアÁあéカÉかóサÓぐúタÚさí0Íずý5Ýぞằ]ẰてầヌẦぬềヘỀひồモỒぷờルỜぽừ_ỪやàイÀいèキÈがòシÒけùチÙざì1Ìせỳ6Ỳたẳ{ẲでẩネẨねểホỂびổヤỔへởレỞまử$ỬゆảウẢうẻクẺきỏスỎげủツỦしỉ2Ỉぜỷ7Ỷだẵ@ẴとẫノẪのễマỄりỗユỖベỡロỠみữ=ỮよãエÃえẽケẼぎõセÕこũテŨじĩ3Ĩれỹ8Ỹちặ}ẶどậハẬはệミỆぴộヨỘぺợワỢむự&ỰらạオẠおẹコẸくọソỌごụトỤすị4Ịそỵ9Ỵぢ11223344556677889900,~'
PHP:
vidu = 'Àà Ừm Đây là dòng chữ tiếng Việt' #Câu ví dụ
vidu2 = vidu.clone #Bản sao
PHP:
for i in 0...vidu.size-1 #Soát lần lượt các chữ cái
if vidu[i] != nil #Kiểm tra xem có phải câu rỗng
if quytac.include?(vidu[i]) #Kiểm tra xem chữ cái có nằm trong bảng quy tắc
for i2 in 0...quytac.size-1 #Soát bảng quy tắc
if quytac[i2] == vidu[i] #Kiểm tra vị trí chữ cần thay
vidu2[i] = quytac[i2+1] #Thay bằng chữ đứng sau
end
end
end
end
end
#vidu2 là câu mới

Ethornell Engine (BGI).
- Tool tham khảo: Chưa có.
- Tool thực tế: Cập nhật sau.
Từ trước đến nay word wrap luôn là vấn đề đau đầu của nhiều dự án, thậm chí đến nỗi drop luôn vì không tìm được tool. Một số khác thì tuyển cả một chức vụ đặc biệt là... line breaker, người chuyên ngắt dòng. Word wrap có nhiều loại khác nhau, tùy thuộc vào engine sử dụng, nhưng thường là không hỗ trợ tiếng Việt. Đối với những engine có hỗ trợ code như Kirikiri thì việc tìm cách để word wrap tự động có thể sẽ dễ dàng hơn, nhưng đối với những engine hard code như BGI hay Leaf thì việc này thường rất khó. Nhưng khó không có nghĩa là bất khả thi, ít ra thì vẫn có thể tìm cách này hay cách khác. Ở phần này, mình xin giới thiệu một cách word wrap cũng rất hiệu quả, đó là dùng Windows API để đo độ dài thực của câu.
+ Độ chính xác cao. + Có thể sử dụng với nhiều engine khác nhau. | - Khá khó nếu không biết code. - Rắc rối với các engine có code đi kèm text. (Kirikiri) - Người chơi không được đổi font nếu dùng cách này. |
*Nên tham khảo các thuật toán word wrap khác nhau.
Bên trên là ví dụ về lỗi ngắt dòng trong engine Kirikiri2, chữ "của" bị tách thành "củ" và "ả". Từ đó, xác định được độ dài tối đa của câu, và nhớ lưu ý luôn cả cỡ chữ. Giờ đến bước thiết lập, code lần này vẫn là Ruby, chạy trên nền tảng RPG Maker VX Ace:
Lệnh để đo độ dài thực tế của câu: text_size("chữ").width
Lưu ý lại một lần nữa, đây chỉ là code tham khảo, code thực tế phức tạp hơn nhiều, nếu có sửa font nữa thì lại càng phức tạp thêm.
PHP:
contents.font.name = ["Tên font"]
contents.font.size = #Cỡ chữ
$charmax = #Độ dài tối đa của câu, tính bằng pixel
$vidu = #Câu ví dụ
PHP:
tach_cau = vidu.split(" ") #Tách từng từ trong câu
vi_tri_hien_tai = 0 #Đang ở dòng thứ mấy
text = "" #Câu hiện tại
for i in 0...tach_cau.size #Xét từng từ một
if text_size(text + tach_cau[i]).width-vi_tri_hien_tai <= $charmax #Kiểm tra độ dài dòng hiện tại
#Nếu chưa đến giới hạn
text += " " if i != 0 #Thêm dấu cách sau mỗi từ
text += tach_cau[i] #Thêm từ vào câu hiện tại
else #Nếu đã đến giới hạn
text += "\n" #Ngắt dòng
vi_tri_hien_tai = text_size(text).width #Cập nhật vị trí hiện tại
text += tach_cau[i] #Thêm từ vào câu hiện tại
end
end
- Tool tham khảo: TLWiki Wordwrap.
- Tool thực tế: Cập nhật sau.
III. Hướng dẫn chi tiết
Ngoài hướng dẫn chung như bên trên ra thì sẽ còn hướng dẫn với các engine cụ thể nữa. Hiện tại mình chỉ định viết cho 2 engine thôi, mọi ý kiến đóng gạch đều được hoan nghênh :57:
- Tiếng Việt trong Ethornell Engine (BGI).
- Tiếng Việt trong Leaf Engine.