วิธีแปลไฟล์ .po โดยไม่ทำให้ตัวแปรโค้ด (%s, HTML) เสียหาย

มันเริ่มต้นด้วยงานง่ายๆ: คุณแปลธีม WordPress ของคุณเป็นภาษาสเปน คุณอัปโหลดไฟล์ .mo รีเฟรชเว็บไซต์ของคุณ และ...
Fatal error: Uncaught ArgumentCountError: Too few arguments to function sprintf()...
หรือบางทีไซต์ของคุณโหลด แต่เลย์เอาต์ก็พังเพราะแท็กปิด </div> ถูกแปลเป็น </ div>
นี่คือความกลัวอันดับหนึ่งของนักพัฒนาทุกคนที่ทำงานเกี่ยวกับการแปล เมื่อคุณใช้เครื่องมือแปลทั่วไป (เช่น Google Translate หรือตัวห่อหุ้ม AI ขั้นพื้นฐาน) กับไฟล์ .po ทางเทคนิค พวกเขาจะไม่ปฏิบัติต่อโค้ดแตกต่างจากข้อความ พวกเขาพยายาม "แปล" ตัวแปรของคุณ และในการทำเช่นนั้น พวกเขาก็ทำลายเว็บไซต์ของคุณ
ในคู่มือนี้ เราจะอธิบายอย่างชัดเจนว่าเหตุใดสิ่งนี้จึงเกิดขึ้นและวิธีรับประกันความปลอดภัยของโค้ด 100% ในการแปลอัตโนมัติของคุณ
กายวิภาคของหายนะ: ทำไม %s ถึงทำให้ไซต์เสียหาย
WordPress ใช้ระบบ Gettext และฟังก์ชัน PHP เช่น sprintf() เพื่อจัดการข้อความไดนามิก
ตัวอย่างเช่น คุณอาจมีสตริงแบบนี้:
msgid "Search results for %s"
%s คือตัวแปรตัวยึดตำแหน่งที่ PHP จะแทรกคำค้นหาของผู้ใช้
AI ทั่วไปทำผิดพลาดได้อย่างไร
เมื่อคุณป้อนสตริงนี้ลงใน Large Language Model (LLM) หรือ API การแปลมาตรฐาน มันจะมองว่า %s เป็นเพียงคำแปลกๆ คำหนึ่ง มันอาจพยายามแก้ไขไวยากรณ์หรือเครื่องหมายวรรคตอนรอบๆ
นี่คือข้อผิดพลาดทางไวยากรณ์ที่พบบ่อยที่สุดที่เราเห็น:
-
เพิ่มช่องว่าง:
- Original:
Hello %s - Bad Translation:
Hola % s - Result: PHP มองหา
%sแต่มันเห็น% sตัวแปรไม่สามารถโหลดได้ ซึ่งมักจะทำให้เกิดข้อผิดพลาดร้ายแรง
- Original:
-
ภาพหลอน HTML:
- Original:
Click <strong>here</strong> to login. - Bad Translation:
Haga clic <strong>aquí</ strong> para iniciar sesión. - Result: AI เพิ่มช่องว่างภายในแท็กปิด
</ strong>CSS ของคุณเสีย และส่วนที่เหลือของหน้าจะกลายเป็นตัวหนา
- Original:
-
สลับอาร์กิวเมนต์:
- Original:
Page %1$s of %2$s - Bad Translation:
Página %2$s de %1$s - Result: AI ตัดสินใจว่าประโยคฟังดูดีกว่าถ้าสลับตัวเลข ตอนนี้การแบ่งหน้าของคุณบอกว่า "หน้า 10 จาก 1"
- Original:
กับดัก "แก้ไขด้วยตนเอง"
นักพัฒนาส่วนใหญ่พยายามแก้ไขปัญหานี้โดยการตรวจสอบไฟล์ด้วยตนเอง หากคุณมีปลั๊กอินขนาดเล็กที่มี 50 สตริง ก็ไม่เป็นไร แต่ถ้าคุณกำลังแปลร้านค้า WooCommerce ที่มี 5,000 สตริงล่ะ
การสแกนโค้ด 5,000 บรรทัดเพื่อหาเครื่องหมายอัฒภาคที่หายไปเพียงตัวเดียวหรือช่องว่างพิเศษภายในตัวแปร %s เป็นไปไม่ได้ ต้องใช้เวลาหลายชั่วโมง และสายตาของมนุษย์จะต้องพลาดอะไรบางอย่างอย่างหลีกเลี่ยงไม่ได้
สคริปต์ Regex (Regular Expressions) สามารถช่วยตรวจสอบการมีอยู่ได้ แต่พวกมันแทบจะไม่จับปัญหาการเรียงลำดับเฉพาะบริบทหรือความเสียหายของแอตทริบิวต์ HTML ที่ละเอียดอ่อน
วิธีแก้ปัญหา: "การล็อกไวยากรณ์"
วิธีเดียวที่จะแปลไฟล์ .po ได้อย่างปลอดภัยคือการป้องกันไม่ให้ AI แตะต้องโค้ดตั้งแต่แรก สิ่งนี้ต้องใช้กระบวนการที่เรียกว่า การล็อกไวยากรณ์
นี่คือเทคโนโลยีหลักเบื้องหลัง SimplePoTranslate
ต่างจากเครื่องมือทั่วไป เราไม่ได้แค่ทิ้งข้อความลงใน AI เราแยกวิเคราะห์โครงสร้าง Gettext ก่อน นี่คือวิธีการทำงานของ "เซฟโหมด" ของเรา:
- การวิเคราะห์: เราสแกนไฟล์
.poของคุณและระบุทุกตัวแปร (%s,%d) อาร์กิวเมนต์ตามตำแหน่งทุกตัว (%1$s) และทุกแท็ก HTML (<br/>,<span>) - การแยกและการล็อก: เราลบองค์ประกอบเหล่านี้ออกจากสตริงชั่วคราวและแทนที่ด้วยโทเค็นที่ไม่เปลี่ยนรูป
- Input:
Hello <strong>%s</strong> - What the AI sees:
Hello [TOKEN_1][TOKEN_2]
- Input:
- การแปล: AI แปลข้อความ "Hello" เป็น "Hola" แต่ไม่สามารถเปลี่ยน
[TOKEN_1]หรือ[TOKEN_2]ได้เนื่องจากถูกล็อก - การสร้างใหม่: เราแทรกโค้ดต้นฉบับกลับเข้าไปในสตริงที่แปลแล้วตรงตำแหน่งที่ถูกต้อง
ผลลัพธ์: ไม่มีไซต์ที่เสียหาย
เนื่องจาก AI ไม่ได้โต้ตอบกับอักขระ %s หรือ HTML จริง จึงเป็นไปไม่ได้ในทางคณิตศาสตร์ที่เอ็นจินการแปลจะเพิ่มช่องว่างภายในตัวแปรหรือทำให้แท็กเสียหาย
เรายังจัดการกฎ Pluralization ที่ซับซ้อน (msgid_plural) สำหรับภาษาต่างๆ เช่น รัสเซียหรือโปแลนด์ เพื่อให้มั่นใจว่าใช้ตัวแปรที่ถูกต้องสำหรับจำนวนที่ถูกต้อง
หยุดเล่นการพนันกับโค้ดของคุณ
คุณไม่ควรต้องไขว้นิ้วทุกครั้งที่คุณอัปโหลดไฟล์ภาษา การแปลควรเกี่ยวกับการเข้าถึงลูกค้าใหม่ ไม่ใช่การแก้ไขข้อผิดพลาด PHP
SimplePoTranslate เป็นเครื่องมือบนคลาวด์ที่ปลอดภัยและทันสมัยที่สุดสำหรับนักพัฒนาที่ใส่ใจในความสมบูรณ์ของโค้ด
- บนคลาวด์: ไม่ต้องติดตั้งปลั๊กอิน
- รับรู้บริบท: ใช้ AI ระดับ Gemini/GPT-4 สำหรับการใช้คำที่ดูเป็นธรรมชาติ
- ล็อกไวยากรณ์: รับประกันการปกป้องตัวแปรของคุณ
พร้อมที่จะแปลโดยไม่ต้องปวดหัวใช่ไหม เริ่มต้นฟรีได้ที่ SimplePoTranslate.com