จาก 42 ภาษาของเรา มี 14 ภาษาที่รูปพหูพจน์ที่เรียกว่า "one" ไม่ได้ใช้เฉพาะกับเลข 1
ภาษา
สตริงของแอป "One habit left today" มีคู่พหูพจน์คือ "%d habits left today" Android จะเลือกระหว่างสองรูปนี้ตามหมวดหมู่: ภาษาอังกฤษใช้ "one" สำหรับเลข 1 และ "other" สำหรับเลขอื่นทั้งหมด ในภาษารัสเซีย หมวดหมู่ "one" ใช้กับเลข 1, 21, 31, 41 และอื่นๆ การตรวจสอบการแปลของเราเคยผิดพลาดเรื่องนี้สองครั้งในวันเดียวกัน โดยผิดคนละทิศทาง
การแปลที่ถูกต้องซึ่งระบบปฏิเสธ
เมื่อวันที่ 2 พฤศจิกายน เราได้รันชุดเครื่องมือแปลภาษาของเราบนแอปตัวอย่างอีกครั้ง สำหรับหมวด "one" ของภาษารัสเซีย โมเดลเขียนว่า "Осталась %d привычка на сегодня" ซึ่งแปลว่า "%d habit left today" พร้อมตัวเลข การตรวจสอบของเราเปรียบเทียบกับรูป "one" ของภาษาอังกฤษ พบว่ามี %d ที่ภาษาอังกฤษไม่มี จึงปฏิเสธโดยมองว่าเป็น placeholder ที่โมเดลสร้างขึ้นเอง ทั้งที่โมเดลถูกต้อง ผู้ใช้ที่มีนิสัยเหลืออยู่ 21 อย่างจะได้รับรูปนี้ ดังนั้นจึงต้องแสดงตัวเลข เราจึงเปลี่ยนการตรวจสอบ: รูปพหูพจน์สามารถเพิ่มตัวเลขที่ใช้ในรูป "other" ของภาษาอังกฤษได้ การรันครั้งถัดไปจึงเขียนครบทั้ง 350 สตริงของแอปตัวอย่าง
การแปลที่ผิดซึ่งระบบจะยอมรับ
การตรวจสอบแบบเดิมยอมให้กรณีตรงข้ามผ่านได้ หากโมเดลเขียนว่า "Осталась одна привычка" (แปลว่า "one habit left") จะไม่มีข้อมูลในสตริงหายไป จึงผ่านการตรวจสอบ แต่ผู้ใช้ที่มีนิสัยเหลืออยู่ 21 อย่างจะได้รับข้อความว่ามีเหลืออยู่หนึ่งอย่าง กฎเดิมยอมให้รูป "one" ตัดตัวเลขออกได้ เพราะในภาษาอังกฤษ "one" ใช้กับเลข 1 เท่านั้น
ตอนนี้การตรวจสอบรู้ว่าแต่ละหมวดหมู่ครอบคลุมเลขใดบ้าง โดยอ้างอิงจาก CLDR ซึ่งเป็นกฎพหูพจน์ของ Unicode ที่ Android และ ICU ใช้ รูปพหูพจน์ของหมวดหมู่ที่ครอบคลุมหลายเลขต้องแสดงตัวเลข ส่วนรูปพหูพจน์ของเลขเดียวอาจละไว้ได้ เช่น "one" ของภาษาเยอรมันใช้กับเลข 1 เท่านั้น ดังนั้น "Noch eine Gewohnheit" จึงใช้ได้
ตำแหน่งที่ "one" ไม่ได้ใช้กับเลข 1 เท่านั้น
ใน 14 จาก 41 ภาษาเป้าหมายที่ข้อมูล CLDR ใน Babel 2.10 รองรับ หมวดหมู่ "one" ครอบคลุมมากกว่าเลข 1:
- 1, 21, 31, 41…: ภาษารัสเซีย ยูเครน เซอร์เบีย มาซิโดเนีย
- 0 และ 1: ภาษาฝรั่งเศส โปรตุเกส เปอร์เซีย อาร์เมเนีย กันนาดา ปัญจาบ อัมฮาริก "Une habitude restante" จะถูกแสดงเมื่อมีนิสัยเหลืออยู่ 0 อย่าง
- 1 และ 11: ภาษาสกอตติชเกลิค 1, 101, 201…: ภาษาสโลวีเนีย ซึ่ง "two" ใช้กับ 102 และ 202 ด้วย
- ทุกเลขที่ไม่ลงท้ายด้วย 4, 6 หรือ 9: ภาษาฟิลิปปินส์
ใน ICU messages การมีสาขาของตัวเองเปลี่ยนพฤติกรรมนี้ เมื่อมี =0{…} ในข้อความ หมวดหมู่ "one" ของภาษาฝรั่งเศสจะเหลือเฉพาะเลข 1 และการตรวจสอบจะคำนึงถึงข้อนี้ด้วย
ตรวจสอบเทียบกับสตริงของ Android เอง
ก่อนส่งมอบกฎ เราได้รันกับข้อความพหูพจน์ในสตริงเฟรมเวิร์กของ Android: 897 การแปลใน 39 ภาษาของเรา ระบบไม่พบข้อผิดพลาด นักแปลของ Google ใส่ตัวเลขไว้ในทุกสาขาที่ครอบคลุมหลายตัวเลข รวมถึงสาขา "one" ของภาษารัสเซีย แม้ภาษาอังกฤษจะมีสาขาเฉพาะสำหรับเลข 1 ก็ตาม เมื่อเราลบตัวเลขออกจากสาขา "one" ของภาษารัสเซียหนึ่งสาขาด้วยตนเอง ระบบตรวจสอบระบุว่ารูปแบบนี้ยังใช้กับเลข 21, 31, 41 และ 51 ด้วย
กฎนี้อยู่ใน translation-checks เวอร์ชัน 1.2.0 ให้ใช้งานฟรีบน GitHub สำหรับข้อความ ICU และอยู่ใน Polyglot เวอร์ชัน 1.2.0 สำหรับพหูพจน์ของ Android และข้อความ ICU ส่วนการตรวจสอบอื่น ๆ ที่เราเพิ่มในสัปดาห์นี้อยู่ใน บันทึกเกี่ยวกับตัวอักษรจากสคริปต์อื่น