วิธีทำแพตช์แปลเกม — แพตช์ไทยของคุณเอง
แพตช์แปลคือสิ่งเดียวที่นักแปลสายแฟนผลิตออกมาจริง ๆ: บรรทัดข้อความ ที่จับคู่กับตำแหน่งในเกมที่มันเป็นเจ้าของ นี่คืองานทั้งหมดตั้งแต่ต้นจนจบ — เลือกระหว่างโอเวอร์เลย์ตอนรันไทม์กับบิลด์ที่ถูกแพตช์ ดึงข้อความ แปล แก้สิ่งที่เครื่องทำผิด ส่งออก ทดสอบในเกม แล้วแจกไฟล์แพตช์แทนที่จะแจกตัวเกม
แพตช์แปลไม่ใช่สำเนาของเกม มันคืองานของผู้แปล — บรรทัดข้อความ บวกข้อมูลมากพอที่จะบอกว่าบรรทัดไหนอยู่ตรงไหน — ในรูปแบบที่คนอื่นเอาไปใช้กับสำเนาของตัวเองได้ ทุกตลาดมีชื่อเรียกของตัวเอง: ฝั่งเกาหลีเรียก 한글패치 ฝั่งรัสเซียเรียก русификатор ฝั่งจีนเรียก 汉化 ส่วนบ้านเราเรียกกันว่าแพตช์ไทยหรือแพตช์ภาษาไทย ตัวชิ้นงานเหมือนกันทุกที่ และงานที่ต้องลงมือทำเพื่อสร้างมันก็เหมือนกัน
แพตช์มีสองแบบ และทางแยกนี้ตัดสินทุกอย่าง
ก่อนจะแตะข้อความสักตัว ให้ตัดสินใจว่าคุณกำลังสร้างอะไรในสองอย่างนี้ เพราะการตัดสินใจแทบทุกข้อหลังจากนั้นตามมาจากมัน
โอเวอร์เลย์ตอนรันไทม์ แปลขณะเกมกำลังทำงาน มีบางอย่างโหลดขึ้นมาคู่กับเกม — ปลั๊กอินภายในเอนจิน text hook ที่อ่านหน่วยความจำของเกม หรือการจับภาพหน้าจอที่อ่านพิกเซล — ดักแต่ละบรรทัดตอนที่มันกำลังจะถูกวาด แล้วสลับคำแปลเข้าไป ไม่มีอะไรของเกมเปลี่ยนบนดิสก์เลย XUnity.AutoTranslator คือตัวอย่างที่รู้จักกันดีสำหรับ Unity และ MTool ทำงานแบบนี้กับ RPG Maker
บิลด์ที่ถูกแพตช์ ใส่คำแปลลงในไฟล์ของเกมเอง ข้อความถูกอ่านออกมาจากข้อมูลที่เอนจินโหลดจริง แปล เขียนกลับ แล้วผลลัพธ์คือโฟลเดอร์เกมที่เปิดและเล่นได้ด้วยตัวเองโดยไม่ต้องมีอะไรรันอยู่ข้าง ๆ นี่คือสิ่งที่ RuneTranslate ผลิตออกมา และเป็นสิ่งที่ Translator++ ผลิตบนเอนจินที่มันแยกวิเคราะห์ได้
ข้อแลกเปลี่ยนตามตรง พูดกันตรง ๆ:
- โอเวอร์เลย์ไม่ต้องทำงานต่อเกม — มัน hook เอนจินได้หรือไม่ได้เท่านั้น — แต่ไม่มีอะไรถูกบันทึกไว้ ทุกบรรทัดถูกแปลใหม่ทุกรอบที่เล่น บนทุกเครื่อง และผู้เล่นทุกคนต้องติดตั้งและตั้งค่าโอเวอร์เลย์เอง
- โอเวอร์เลย์เข้าถึงได้แค่ข้อความในจังหวะที่มันถูกวาด ข้อความที่อบอยู่ในงานศิลป์ ข้อความที่ไม่เคยผ่านคอมโพเนนต์ที่ถูก hook และข้อความที่วาดด้วยตัวเรนเดอร์แบบกำหนดเอง จะไม่ถูกแปล
- บิลด์ที่ถูกแพตช์มีต้นทุนคือขั้นตอนส่งออกและรอบทดสอบ และต้องทำใหม่เมื่อเกมอัปเดต สิ่งที่คุณได้กลับมาคือความถาวร: ไฟล์เก็บคำแปลไว้ เกมจึงเป็นเกมที่แปลแล้วจริง ๆ ใช้ได้ออฟไลน์ สำหรับทุกคนที่นำงานของคุณไปใช้
- บิลด์ที่ถูกแพตช์ให้บันทึกที่แก้ไขได้ คุณแก้บรรทัดที่ไม่ดีหนึ่งบรรทัดในอีกหกเดือนได้โดยไม่ต้องแปลอย่างอื่นใหม่ — โอเวอร์เลย์ไม่มีอะไรให้แก้ มีแต่แคชให้ล้าง
ถ้าคุณแปลให้ตัวเอง ครั้งเดียว บนเอนจินที่แยกวิเคราะห์ไม่ได้ โอเวอร์เลย์คือคำตอบที่สมเหตุสมผลและไม่ใช่เรื่องน่าอาย แต่ถ้าคุณตั้งใจจะส่งงานให้คนอื่น คุณต้องการบิลด์ที่ถูกแพตช์ — เพราะแพตช์จะแบ่งปันได้ก็ต่อเมื่อมันมีอยู่ในรูปของไฟล์
สิ่งที่ต้องมีก่อนเริ่ม
- สำเนาเกมที่คุณเป็นเจ้าของ ติดตั้งแล้วและเล่นได้ ลองเล่นสักสองสามนาทีก่อน — คุณตัดสินไม่ได้ว่าคำแปลอ่านถูกต้องไหมถ้าไม่เคยเห็นบริบทเลย
- ความรู้ว่าเกมใช้เอนจินอะไร ข้อนี้กำหนดทุกอย่างเกี่ยวกับวิธีที่ข้อความออกมาและกลับเข้าไป
- ภาษาปลายทางที่คุณอ่านออกจริง ๆ การแปลด้วยเครื่องให้ร่างแรกกับคุณ มันไม่ได้ให้แพตช์กับคุณ
- พื้นที่ดิสก์สำหรับสำเนาเกมชุดที่สอง บิลด์ที่ถูกแพตช์เป็นโฟลเดอร์แยกต่างหาก — ต้นฉบับของคุณไม่ถูกแก้ไขเลย
การระบุเอนจินมักเป็นแค่การมองเข้าไปในโฟลเดอร์เกม โฟลเดอร์ www/data หรือ data ที่เต็มไปด้วยไฟล์ JSON คือ RPG Maker MV หรือ MZ; โฟลเดอร์ <Game>_Data คือ Unity; game/*.rpy หรืออาร์ไคฟ์ .rpa คือ Ren'Py; อาร์ไคฟ์ .xp3 คือ Kirikiri รายการเต็มของสิ่งที่แยกวิเคราะห์ได้พร้อมจุดสังเกตของแต่ละตัวอยู่ที่ หน้าเอนจิน — RuneTranslate ครอบคลุม 17 เอนจินและรูปแบบ และการตรวจจับเป็นอัตโนมัติเมื่อคุณชี้ไปที่โฟลเดอร์
เวิร์กโฟลว์
ไม่ว่าจะเอนจินไหน การทำแพตช์คือห้าขั้นตอนเดียวกันในลำดับเดียวกัน สิ่งที่คนอยากข้ามคือขั้นที่สาม อย่าข้าม
- ดึงข้อความ — อ่านสตริงที่แปลได้ทุกตัวออกจากไฟล์ของเกมเองเข้าสู่รายการที่คุณทำงานด้วยได้
- แปล — ส่งรายการนั้นผ่านผู้ให้บริการแปลด้วยเครื่องเพื่อให้ได้ร่างแรกที่ครบถ้วน
- ตรวจทาน — ไล่ดูบรรทัดที่เครื่องมักแปลผิดเป็นประจำ: ชื่อ คำลงท้ายแสดงความสุภาพ คำศัพท์เฉพาะ และอะไรก็ตามที่มีตัวยึดตำแหน่งอยู่ในนั้น
- ส่งออก — เขียนคำแปลกลับลงในรูปแบบของเกมแล้วสร้างบิลด์ที่เล่นได้
- ทดสอบ — เปิดบิลด์นั้นแล้วเล่นมันจริง ๆ
ดึงข้อความ
การดึงข้อความคือจุดที่ความรู้เรื่องเอนจินคุ้มค่า บทสนทนาแทบไม่เคยอยู่ในไฟล์ข้อความธรรมดา: RPG Maker เก็บมันไว้ในโค้ดคำสั่งอีเวนต์, Unity เก็บใน TextAsset และฟิลด์ MonoBehaviour ภายในไฟล์แอสเซ็ตแบบไบนารี, Kirikiri เก็บในสคริปต์ภายในอาร์ไคฟ์ที่เข้ารหัส, Unreal เก็บในตาราง .locres ภายใน .pak ตัวดึงข้อความที่ดียังรู้ว่าอะไรที่ ไม่ควร ส่งมาให้คุณ — ชื่อฉาก คีย์ตัวแปร ตัวถูกดำเนินการเปรียบเทียบ และพาธแอสเซ็ต ล้วนดูเหมือนสตริงและล้วนทำให้เกมพังถ้าถูกแปล ข้อความที่วาดอยู่ในงานศิลป์เป็นคนละปัญหาและใช้คนละเครื่องมือ ดู การแปลรูปภาพ
แปล
ให้ได้ร่างจากเครื่องครบทั้งชุดก่อนจะลงมือแก้ด้วยมือ คุณจะได้แก้ข้อความแทนที่จะนั่งจ้องคอลัมน์ว่าง RuneTranslate มีผู้ให้บริการ 9 ราย — Google, DeepL ฟรี และ DeepL Classic / Next-gen ไม่ต้องใช้คีย์ API เลย ส่วน API ของ DeepL, OpenAI, Anthropic Claude, DeepSeek, endpoint ใดก็ได้ที่เข้ากันได้กับ OpenAI และโมเดลบนเครื่องผ่าน Ollama หรือ LM Studio คือที่เหลือ ระดับฟรีปลดล็อกทุกรายและทุกเอนจิน สิ่งที่มันจำกัดคือปริมาณงานและการถือโปรเจกต์มากกว่าหนึ่งอันพร้อมกัน ผู้ให้บริการรายไหนเหมาะกับเกมแบบไหนอยู่ใน การเปรียบเทียบผู้ให้บริการ
ตรวจทาน
นี่คือขั้นที่ทำให้แพตช์คุ้มค่าแก่การนำไปใช้ ผลลัพธ์จากเครื่องลื่นไหลและผิดอย่างมั่นใจในจุดที่คาดเดาได้ ให้ไล่จุดเหล่านั้นอย่างตั้งใจ แทนที่จะอ่านทุกอย่างจากบนลงล่าง:
- ชื่อตัวละคร เครื่องแปลชื่อไม่เหมือนกันทุกครั้งที่เจอ และบางครั้งก็แปลชื่อออกมาเป็นคำธรรมดา ตัดสินใจเรื่องการสะกดครั้งเดียวให้จบ
- คำลงท้ายแสดงความสุภาพและระดับภาษา จะเก็บ -san / -chan ไว้หรือตัดทิ้งเป็นการตัดสินใจระดับโปรเจกต์ ไม่ใช่ระดับบรรทัด เช่นเดียวกับการที่ตัวละครหนึ่งพูดจาสุภาพหรือไม่
- คำศัพท์เฉพาะ สกิล ไอเทม สถานที่ ระบบ และทุกอย่างที่เกมคิดขึ้นเอง สกิลชื่อเดียวที่เขียนไปสามแบบในเมนู ในทูลทิป และในบันทึกการต่อสู้ อ่านออกมาเหมือนเกมพัง
- ตัวยึดตำแหน่งและโค้ดควบคุม อะไรอย่าง
\C[1],{player}หรือ[name]ต้องรอดมาครบถ้วน ตัวยึดตำแหน่งที่ถูกแปลคือการแครชหรือช่องว่าง ไม่ใช่แค่คำสะกดผิด - บรรทัดที่กลับมาเหมือนเดิม มักเป็นคำเลียนเสียง และมักเป็นสัญญาณว่าผู้ให้บริการยอมแพ้กับบรรทัดนั้น
ความสม่ำเสมอของคำศัพท์
แพตช์ถูกทิ้งกลางคันเพราะความไม่สม่ำเสมอมากกว่าเพราะสำนวนแย่ ผู้เล่นให้อภัยประโยคที่แข็ง ๆ ได้ แต่ไม่ให้อภัยตัวละครคนเดียวที่ถูกเรียกว่า Yuuki, Yuki และ Snow ในบทสนทนาเดียวกัน เพราะมันทำให้ตามไม่ทันว่าใครกำลังพูด วิธีแก้คืออภิธานศัพท์: รายการคำต้นทางและคำปลายทางที่แต่ละคำต้องกลายเป็น ใช้บังคับก่อนการแปลเพื่อไม่ให้ผู้ให้บริการมีโอกาสด้นสด สร้างมันตั้งแต่เนิ่น ๆ จากชื่อที่คุณเจอในชั่วโมงแรก แล้วเพิ่มไปเรื่อย ๆ — คู่มืออภิธานศัพท์ อธิบายว่ามันทำงานร่วมกับการปิดบังแท็กอย่างไร และทำไมมันควรอยู่ตอนต้น แทนที่จะเป็นการค้นหาและแทนที่ตอนท้าย
ฟอนต์
เกมญี่ปุ่นส่งฟอนต์ญี่ปุ่นมา และฟอนต์ญี่ปุ่นมักไม่มีกลิฟสำหรับซีริลลิก กรีก ฮันกึล ไทย หรืออักษรละตินมีเครื่องหมายกำกับของโปแลนด์ ตุรกี และเวียดนาม แปลเป็นภาษาเหล่านั้นแล้วเกมจะเรนเดอร์เป็นกล่องว่าง — คำแปลถูกต้อง แต่ฟอนต์วาดมันไม่ได้เฉย ๆ บางเอนจินถูกจัดการให้แล้ว: การส่งออก Ren'Py จะรวมฟอนต์ที่รองรับมาให้และรีแมปฟอนต์ของเกมไปหามัน ส่วนที่ไม่อัตโนมัติ การแทนที่ไฟล์ฟอนต์ในบิลด์ที่ส่งออกมักแก้ได้ เครื่องหมายคำถามตรง ๆ เป็นความผิดพลาดคนละแบบโดยสิ้นเชิง — นั่นคือการเข้ารหัสสตริงของเอนจินเองปฏิเสธอักขระ ไม่ใช่กลิฟที่หายไป — และความต่างนี้ควรรู้ก่อนจะออกไปตามหาวิธีแก้ที่ผิด ทั้งสองกรณีอยู่ใน คำถามที่พบบ่อย
ทดสอบบิลด์
การส่งออกที่ไม่มีข้อผิดพลาดไม่ใช่แพตช์ที่ผ่านการทดสอบ เปิดมันขึ้นมาแล้วตรวจสิ่งที่พังแบบเงียบ ๆ:
- เกมไปถึงหน้าจอไตเติลและเริ่มเกมใหม่ได้ บิลด์ที่พังตรงนี้มักพังเพราะบรรทัดที่ไม่เคยเป็นข้อความ — ตัวระบุที่ถูกแปลไป
- กล่องข้อความเก็บข้อความไว้ได้ คำแปลยาวกว่าภาษาญี่ปุ่น ให้มองหาบรรทัดที่ล้นขอบกล่องหรือถูกตัดหาย
- เมนู ชื่อไอเทม และทูลทิป — จุดที่คำยาว ๆ ล้นปุ่มความกว้างคงที่
- ไฟล์เซฟจากเกมต้นฉบับยังโหลดได้ และเซฟใหม่ที่สร้างในบิลด์ที่แพตช์แล้วก็โหลดได้ด้วย
- ฉากหนึ่งที่อยู่ลึกเข้าไปในเกม ไม่ใช่แค่ตอนเปิดเรื่อง ช่องโหว่ของการดึงข้อความจะโผล่มาเป็นช่วงที่ไม่ถูกแปล ไม่ใช่เป็นข้อผิดพลาด
การแบ่งปันงานของคุณ
นี่คือส่วนที่ตัดสินว่าแพตช์ของคุณเป็นสิ่งที่แจกจ่ายได้หรือไม่ สิ่งที่คุณสร้างขึ้นคือ คำแปล — บรรทัดข้อความ เกมไม่ใช่ของคุณ และการแพ็กสำเนาเกมที่แปลแล้วหมายถึงการแจกจ่ายเกมของคนอื่น รูปแบบที่ตรงไปตรงมาของแพตช์คืองานเพียว ๆ ที่ผู้รับแต่ละคนนำไปใช้กับสำเนาที่ตัวเองมีอยู่แล้ว
RuneTranslate ส่งออกสิ่งนั้นออกมาเป็นไฟล์ .rtpatch พอดี มันบรรจุ id ของยูนิต บรรทัดต้นฉบับที่แต่ละคำแปลจับคู่ด้วย และคำแปลของคุณ ไม่มีไฟล์เกม ไม่มีแอสเซ็ต ไม่มีไบนารี — ไฟล์นี้คือข้อความของคุณและไม่มีอะไรอื่น ซึ่งเป็นเหตุผลที่มันเล็กพอจะแนบไปกับข้อความ และปลอดภัยพอจะส่งให้ใครก็ได้
ฝั่งผู้รับมีสามขั้นตอน:
- เขาสร้างโปรเจกต์จากสำเนาเกมเดียวกันที่ติดตั้งไว้เอง ซึ่งจะดึงบรรทัดชุดเดียวกันออกมาบนเครื่องของเขา
- เขานำเข้าไฟล์
.rtpatchของคุณ ซึ่งเติมคำแปลของคุณลงในบรรทัดเหล่านั้น - เขาส่งออกบิลด์ที่เล่นได้ของตัวเองจากไฟล์เกมของตัวเอง
การจับคู่ใช้ id ของยูนิตก่อน แล้วถอยไปจับคู่ด้วยบรรทัดต้นฉบับเองเมื่อ id คลาดเคลื่อน — จากการอัปเดตเกมหรือจากการเปลี่ยนแปลงในตัวดึงข้อความ การถอยกลับนั้นคือสิ่งที่ทำให้แพตช์ยังใช้ได้หลังเกมออกแพตช์ การนำเข้าจะตรวจว่าเอนจินและภาษาปลายทางตรงกันก่อนจะใช้อะไร แพตช์ที่ทำมาสำหรับเกม Unity จึงหย่อนลงในโปรเจกต์ Ren'Py โดยบังเอิญไม่ได้ บนระดับฟรี การแบ่งปันแพตช์ถูกจำกัดที่การส่งออกหนึ่งครั้งและการนำเข้าหนึ่งครั้งต่อช่วงสามวันแบบหมุน ส่วนอย่างอื่นในการทำแพตช์ไม่ถูกจำกัดด้วยฟีเจอร์
ไฟล์เดียวกันนี้คือวิธีที่ทีมทำงานร่วมกัน — คนหนึ่งแปลเนื้อเรื่อง อีกคนแปลเมนู แล้วแพตช์ถูกรวมเข้าเป็นโปรเจกต์เดียว — และเป็นวิธีที่คุณเก็บงานของตัวเองไว้เมื่อเกมอัปเดต: ดึงข้อความใหม่จากเวอร์ชันใหม่ นำเข้าแพตช์เก่าของคุณ แล้วจะมีเฉพาะบรรทัดที่เปลี่ยนไปจริง ๆ ที่ต้องดูแล
ส่วนคำถามว่าตัวเกมเองแจกจ่ายซ้ำได้หรือไม่ เป็นสิทธิ์ของเจ้าของลิขสิทธิ์ ไม่ใช่ของคุณและไม่ใช่ของเรา แจกแพตช์ บอกผู้คนว่ามันทำมาจากเกมเวอร์ชันไหน แล้วให้เขาหาสำเนาของตัวเองมา
รายละเอียดเฉพาะของแต่ละเอนจิน
ทุกอย่างข้างบนคือรูปทรงของงาน สิ่งที่ต่างกันในแต่ละเอนจินคือข้อความอยู่ที่ไหน การส่งออกผลิตอะไรออกมา และอะไรที่ยังเอื้อมไม่ถึง — และควรอ่านก่อนเริ่ม มากกว่าจะไปอ่านหลังจากการส่งออกทำคุณประหลาดใจ: Unity, RPG Maker, Ren'Py หรือ รายการเอนจินฉบับเต็ม สำหรับอีกสิบสี่ตัวที่เหลือ
RuneTranslate ทำงานบน Windows 10 และ 11 และบน Linux กับ Steam Deck ผ่าน Wine หรือ Proton ต้องลงชื่อเข้าใช้ Patreon แบบฟรีตอนเปิดครั้งแรก ระดับฟรีเปิดทุกเอนจินและทุกผู้ให้บริการ ถ้าคุณกำลังชั่งน้ำหนักมันกับโอเวอร์เลย์และชุดเครื่องมือที่คนมักหยิบก่อน การเปรียบเทียบ แจกแจงว่าแต่ละแนวทางให้อะไรกับคุณจริง ๆ
พร้อมลอง RuneTranslate ไหม
ระดับฟรีปลดล็อกทุกเอนจิน + ทุกผู้ให้บริการแปล Supporter ($3/mo) ปลดล็อกความเร็วเต็ม
ดาวน์โหลดสำหรับ Windows
