ข้ามไปที่เนื้อหา

สำหรับนักแปล

หน้านี้มีไว้สำหรับคนที่แก้ไขแคตตาล็อก ไม่ใช่คนที่เขียนโค้ด มันสั้นโดยตั้งใจ และตั้งใจให้ถูกลิงก์หรือคัดลอกไปใส่ในคำแนะนำสำหรับนักแปลของแต่ละโปรเจกต์

ไม่มีอะไรในหน้านี้ที่บังคับให้คุณต้องอ่าน Python ออก ทุกอย่างในหน้านี้ว่าด้วยสิ่งเดียว: ชิ้นส่วนของข้อความที่อยู่ในวงเล็บปีกกา

ตัวยึดตำแหน่งคืออะไร

ข้อความในแคตตาล็อกอาจมีชื่ออยู่ในวงเล็บปีกกา:

msgid "Hello {name}"
msgstr ""

{name} คือ ตัวยึดตำแหน่ง เมื่อโปรแกรมแสดงข้อความนี้ มันจะแทนที่ {name} ด้วยค่าที่ตัวมันเองจัดหามา — ชื่อคน ชื่อไฟล์ หรือตัวเลข ตัวยึดตำแหน่งไม่ใช่คำที่ต้องแปล มันคือช่องว่างที่รอค่า

คำแปลของคุณอยู่ใน msgstr และมันต้องเก็บช่องนั้นไว้:

msgid "Hello {name}"
msgstr "こんにちは {name}"

อะไรที่เปลี่ยนได้ และอะไรที่เปลี่ยนไม่ได้

คุณ ทำได้:

  • ย้ายตัวยึดตำแหน่ง ไปยังตำแหน่งใดก็ได้ที่ไวยากรณ์ของภาษาปลายทางต้องการ รวมถึงย้ายไปไว้หน้าสุดของข้อความ
  • ใช้ตัวยึดตำแหน่งซ้ำ หากภาษานั้นต้องการค่าเดียวกันสองครั้ง
  • เขียนคำอื่น ๆ ใหม่ทั้งหมด รวมถึงเครื่องหมายวรรคตอน การเว้นวรรค และลำดับของประโยค

คุณ ต้องไม่:

  • แปลชื่อที่อยู่ในวงเล็บปีกกา {name} ต้องคง {name} ไว้ แม้แต่ในภาษาที่ไม่ได้เขียนอย่างอื่นด้วยอักษรละตินเลย
  • ลบวงเล็บปีกกาออก หรือเขียนชื่อโดยไม่มีวงเล็บ
  • แทนวงเล็บปีกกา ASCII { } ด้วยแบบเต็มความกว้าง input method หลายตัวสร้างรูปแบบเต็มความกว้างออกมา มันดูเกือบเหมือนกัน แต่ใช้งานไม่ได้
  • เพิ่มการจัดรูปแบบ เช่น {name!r} หรือ {amount:.2f} วิธีแสดงผลของค่าถูกตัดสินในตัวโปรแกรม ไม่ใช่ในแคตตาล็อก
  • เสกตัวยึดตำแหน่ง ที่ไม่มีอยู่ใน msgid

หากข้อความหนึ่งต้องการค่าที่ต้นฉบับไม่ได้เสนอมาให้ นั่นคือข้อความที่นักพัฒนาต้องเป็นคนแก้ จงบอกออกไปแทนที่จะหาทางเลี่ยงเอาเอง

รูปพหูพจน์

ข้อความที่มีการนับจะมาพร้อมช่อง msgstr หนึ่งช่องต่อหนึ่งรูปพหูพจน์ในภาษาของคุณ และภาษาของคุณเป็นผู้ตัดสินว่ามีกี่ช่อง — หนึ่งช่องสำหรับภาษาญี่ปุ่น สองช่องสำหรับภาษาเยอรมัน สามช่องสำหรับภาษารัสเซีย หกช่องสำหรับภาษาอาหรับ จงเติมทุกช่องที่แคตตาล็อกให้มา

มีสองกฎที่ทำให้คนพลาดกันบ่อย:

  • ช่องเหล่านั้นไม่ใช่ "เอกพจน์ พหูพจน์ พหูพจน์กว่า" แต่ละดัชนีมีความหมายตามที่กฎพหูพจน์ของภาษาคุณกำหนด รูปที่สามของภาษาลัตเวียมีไว้สำหรับศูนย์เท่านั้น รูปที่สองของภาษาสโลวีเนียมีไว้สำหรับสองพอดี ส่วนภาษาเวลส์วางกรณีทั่วไปไว้ที่ดัชนี 0 และวางเอกพจน์ไว้ที่ดัชนี 1
  • สองช่องอาจมีข้อความเหมือนกันได้อย่างถูกต้อง ในภาษาตุรกี ฮังการี เปอร์เซีย และเบงกาลี คำนามยังคงเป็นเอกพจน์หลังตัวเลข ทั้งสองรูปของข้อความที่มีการนับจึงเป็นสตริงเดียวกัน นั่นถูกต้องแล้ว ไม่ใช่ความพลาดจากการคัดลอกวาง

กฎเรื่องตัวยึดตำแหน่งข้างต้นใช้กับทุกรูปอย่างเป็นอิสระต่อกัน

รายการ fuzzy

รายการที่ติดธง fuzzy คือการเดาของเครื่อง: นักพัฒนาเปลี่ยนข้อความต้นฉบับ และเครื่องมือได้จับคู่ข้อความใหม่เข้ากับคำแปลเดิมของคุณ เพื่อให้คุณมีจุดตั้งต้น

#, fuzzy
msgid "Welcome back, {name}"
msgstr "こんにちは {name}"

รายการ fuzzy ไม่ถูกโปรแกรมนำไปใช้ — โปรแกรมจะแสดงต้นฉบับที่ยังไม่ได้แปลแทน — จนกว่าจะมีคนแก้ข้อความแล้วลบเครื่องหมาย fuzzy ออก โปรแกรมแก้ไข PO ส่วนใหญ่มีปุ่มสำหรับเรื่องนี้โดยเฉพาะ

การอ่านข้อความแจ้งข้อผิดพลาด

เครื่องมือจะตรวจตัวยึดตำแหน่งตอนคอมไพล์แคตตาล็อก และข้อความที่แจ้งออกมาเขียนขึ้นเพื่อคุณ ไม่ใช่เพื่อโปรแกรมเมอร์ การรายงานเพียงว่า {name} หายไปเป็นทางตัน ในเมื่อคุณมองเห็นอักขระเหล่านั้นอยู่ตรงหน้า ดังนั้นเมื่อตัวยึดตำแหน่งดูเหมือนมีอยู่แต่จริง ๆ แล้วไม่มี ข้อความจะบอกเหตุผลด้วย เทียบกับต้นฉบับ Hello {name} แต่ละกรณีต่อไปนี้จะถูกรายงานภายใต้ translation does not match the source placeholders:

คำแปลของคุณเขียนว่า เหตุผลที่รายงาน
こんにちは {name} {name} is missing (the braces around it are not the ASCII { and })
こんにちは {{name}} {name} is missing (it is written {{name}}, which is how a literal brace is escaped)
こんにちは name {name} is missing (the name appears, but not inside braces)
こんにちは {名前} {name} is missing; {名前} is not in the source message

อักขระที่มองไม่เห็นได้รับการปฏิบัติแยกต่างหาก no-break space ภายใน วงเล็บปีกกาเป็นสิ่งที่ input method สร้างขึ้นได้และไม่มีอีดิเตอร์ใดแสดงให้เห็น ข้อความจึงพิมพ์มันเป็น code point แทนที่จะเรียกชื่ออักขระที่คุณไม่มีวันหาเจอ

placeholder {<U+00A0>name} has a space inside the braces; write {name}

ชื่อที่ตัวอักษรผสมกันหลายระบบการเขียน — กรณี homoglyph ที่อักษรซีริลลิก а แยกไม่ออกจากอักษรละติน — จะถูกแสดงสองครั้ง ครั้งหนึ่งแบบอ่านได้และอีกครั้ง แบบ escape ซึ่งเป็นรูปเดียวที่บอกความแตกต่างของทั้งสองได้

translation does not match the source placeholders: {name} is missing;
{nаme} (n\u0430me) is not in the source message

การแยกแยะแบบเดียวกันนี้ใช้กับกรณีที่ชื่อซึ่งเขียนด้วยอักษรกรีกหรือซีริลลิกล้วน ชนกับชื่อต้นทางแบบ ASCII รวมถึงกรณีอักษรตัวเดียวอย่างละติน a กับซีริลลิก а

หากคุณเจอกรณีใดกรณีหนึ่งเหล่านี้แล้ววิธีแก้ไม่ชัดเจน ทางที่ปลอดภัยคือลบตัวยึดตำแหน่งที่คุณพิมพ์ไว้ทิ้ง แล้วคัดลอกอันที่อยู่ใน msgid มาใช้

สิ่งที่การตรวจสอบทำไม่ได้

เครื่องมือยืนยันได้ว่าตัวยึดตำแหน่งของคุณยังครบถ้วน แต่มันบอกไม่ได้ว่าคำแปลนั้นถูกต้อง เป็นธรรมชาติ หรือเหมาะกับบริบทหรือไม่ — เรื่องนั้นยังคงอยู่ในมือคุณทั้งหมด

มีสองสิ่งที่ช่วยได้มากกว่าการตรวจใด ๆ:

  • อ่านคอมเมนต์สำหรับนักแปล บรรทัดที่ขึ้นต้นด้วย #. เหนือข้อความ คือนักพัฒนากำลังบอกคุณว่าข้อความนั้นปรากฏที่ไหนและหมายความว่าอย่างไร
  • ถามเรื่อง msgctxt เมื่อคำเดียวกันปรากฏสองครั้งพร้อมบริบทต่างกัน นั่นเป็นเพราะทั้งสองต้องแปลไม่เหมือนกัน — เช่น "Open" ที่เป็นปุ่ม กับ "Open" ที่เป็นสถานะ