DeepL เทียบกับ Google Translate เทียบกับ AI: อะไรดีที่สุดสำหรับไฟล์ .po?

คุณส่งออกไฟล์ .pot จากปลั๊กอิน WordPress ของคุณ คัดลอกสตริงหลายร้อยสตริงลงใน DeepL หรือ Google Translate ได้คอลัมน์ภาษาเยอรมันที่เรียบร้อยกลับมา นำไปใส่ในไฟล์ .po ของคุณ คอมไพล์ และจัดส่ง จากนั้น ผู้ใช้รายงานว่าหน้าตะกร้าสินค้าแสดง %1$s ดิบๆ ในตำแหน่งที่ควรจะเป็นชื่อสินค้า หรือแย่กว่านั้น คือบรรทัดราคากลับแสดง You have 1 items ในทุกภาษา เพราะรูปแบบพหูพจน์พัง คุณภาพ การแปลนั้นดี แต่ โครงสร้าง ของการแปลถูกทำลาย
นั่นคือความตึงเครียดหลักในการถกเถียงเรื่อง DeepL เทียบกับ Google Translate เมื่อต้นฉบับเป็นไฟล์ gettext .po แทนที่จะเป็นย่อหน้าธรรมดา ทั้งสองเป็นเครื่องมือระดับโลกในการแปลประโยคธรรมชาติ แต่ไม่ได้ถูกออกแบบมาเพื่อรองรับ printf placeholder, Gettext plural array หรือ msgctxt disambiguation พวกมันถือว่า %1$s เป็นการพิมพ์ผิดที่ต้องแก้ไข และพหูพจน์แบบสองรูปแบบเป็นประโยคเดียวที่ต้องทำให้แบนราบลง สำหรับข้อความทางการตลาด สิ่งนี้อาจไม่เป็นปัญหา แต่สำหรับการแปลซอฟต์แวร์ มันทำให้เว็บไซต์เสีย
โพสต์นี้จะเปรียบเทียบการแปลด้วยเครื่องแบบคลาสสิก — DeepL และ Google Translate — กับ AI pipeline ที่เข้าใจบริบทซึ่งสร้างขึ้นมาโดยเฉพาะสำหรับ gettext เราจะพิจารณาประเด็นที่สำคัญจริงๆ สำหรับไฟล์ .po: การจัดการ placeholder, รูปแบบพหูพจน์, บริบท, การรองรับไฟล์จำนวนมาก และค่าใช้จ่าย หากคุณต้องการการสนทนาเชิงลึกเกี่ยวกับคุณภาพของ LLM เทียบกับ LLM เราได้ครอบคลุมเรื่องนั้นไว้ใน คุณภาพการแปลด้วย AI: Gemini vs GPT-4 vs DeepSeek ในที่นี้ คำถามจะแคบลงและเป็นเชิงปฏิบัติมากขึ้น: อะไรคือสิ่งที่ดีที่สุดสำหรับไฟล์ .po?
DeepL เทียบกับ Google Translate: สร้างมาเพื่ออะไร
ทั้งสองเป็นเอนจินการแปลด้วยเครื่องอเนกประสงค์ที่ปรับให้เหมาะสมสำหรับการส่งออกภาษาที่เป็นธรรมชาติและลื่นไหล ไม่มีตัวใดที่แยกวิเคราะห์รูปแบบไฟล์ได้
DeepL - ลื่นไหล แต่ไม่รู้จักรูปแบบ
DeepL ได้รับการยกย่องอย่างกว้างขวางสำหรับการส่งออกผลลัพธ์ที่ฟังดูเป็นธรรมชาติที่สุด โดยเฉพาะอย่างยิ่งในกลุ่มภาษาในยุโรป แต่มันนำเข้าเฉพาะข้อความ ไม่ใช่โครงสร้าง หากคุณป้อน .po msgid ที่มี %1$s ordered %2$s เข้าไป มันจะแปลคำรอบๆ placeholder ในขณะที่มักจะจัดเรียงใหม่ เว้นวรรค หรือทิ้งโทเค็นเหล่านั้นไป — เพราะสำหรับ DeepL แล้ว สิ่งเหล่านั้นเป็นเพียงอักขระแปลกๆ ในประโยคเท่านั้น
Google Translate - ครอบคลุมกว้างขวาง แต่มีจุดบอดเดียวกัน
Google Translate รองรับภาษาได้มากกว่ามาก และเป็นตัวเลือกเริ่มต้นที่ประหยัดงบสำหรับปลั๊กอินเช่น GTranslate การจัดการ placeholder ของมันก็ไม่ดีไปกว่ากัน เอนจินทั้งสองมีข้อจำกัดพื้นฐานเดียวกัน: พวกมันปรับปรุงความลื่นไหลของประโยค และไม่มีโมเดลสำหรับกฎของ gettext
คำถามที่แท้จริงไม่ใช่เรื่องคุณภาพ - แต่เป็นเรื่องโครงสร้าง
สำหรับไฟล์ .po คุณภาพภาษาดิบเป็นเพียงจุดเริ่มต้น สิ่งที่ทำให้งานผลิตหยุดชะงักคือความสมบูรณ์ของโครงสร้าง: ตัวแปรยังอยู่ครบถ้วนหรือไม่, พหูพจน์ยังคงอยู่ในหลายรูปแบบหรือไม่, บริบทได้รับการเคารพหรือไม่ นั่นคือจุดที่ AI pipeline ที่เข้าใจ gettext เหนือกว่าทั้ง DeepL และ Google Translate
ทำไม Placeholders และ Plurals ถึงพังเมื่อแปลด้วยเครื่อง
ไฟล์ .po ไม่ใช่ข้อความเรียงความ มันเป็นข้อความที่อยู่ติดกับโค้ดซึ่งมีกฎที่เข้มงวด และสามในกฎเหล่านั้นมักจะเอาชนะ MT แบบคลาสสิกได้
การบิดเบือน Placeholder และตัวแปร
สตริงของ WordPress เต็มไปด้วย printf-style placeholder: %s, %d และรูปแบบที่มีตำแหน่ง เช่น %1$s และ %2$s รูปแบบที่มีตำแหน่งเหล่านี้มีความสำคัญเพราะบางภาษาจัดเรียงประโยคใหม่ และตัวเลขจะบอก sprintf ว่าอาร์กิวเมนต์ตัวไหนไปอยู่ที่ใด ดูว่า MT แบบคลาสสิกทำอะไรกับสิ่งนี้:
// Source string in your .po file
$msg = sprintf( __( '%1$s left a comment on %2$s', 'mytheme' ), $user, $post );
// What DeepL / Google Translate often return (German):
// "%2$s hat einen Kommentar zu %1$s hinterlassen" <- reordered, OK
// "% 1$ s hat einen Kommentar..." <- spaces injected, BROKEN
// "hat einen Kommentar hinterlassen" <- placeholders dropped, BROKEN
การเว้นวรรคเพียงเล็กน้อย (% 1$ s) หรือโทเค็นที่หล่นหายไปจะทำให้เกิด PHP warning หรือแสดงโค้ดดิบต่อผู้ใช้ของคุณ เราเจาะลึกถึงโหมดความล้มเหลวนี้ใน วิธีแปลไฟล์ PO โดยไม่ทำให้ตัวแปรโค้ดเสียหาย
รูปแบบพหูพจน์พังทลาย
Gettext plurals ไม่ใช่สตริงเดียว แต่เป็นอาร์เรย์ที่ใช้กฎพหูพจน์ของภาษาเป็นคีย์ ภาษาอังกฤษมีสองรูปแบบ; ภาษาโปแลนด์มีสาม; ภาษาอาหรับมีหก MT แบบคลาสสิกจะรับ msgid_plural เป็นสองประโยคแยกกันและแปลโดยอิสระ โดยไม่ตระหนักว่าพวกมันจะต้องคงอยู่ในชุดหลายรูปแบบที่สอดคล้องกัน ผลลัพธ์มักจะเป็นรูปแบบเดียวที่ถูกทำซ้ำ ทำให้ 1 item และ 5 items แสดงผลเหมือนกัน
msgid "%d item in your cart"
msgid_plural "%d items in your cart"
msgstr[0] ""
msgstr[1] ""
# A gettext-aware pipeline fills BOTH forms correctly with %d preserved.
# DeepL/Google translate each line in isolation and lose the plural relationship.
บริบท (msgctxt) ถูกละเลย
Gettext ใช้ msgctxt เพื่อแยกความแตกต่างของสตริงที่เหมือนกัน -