Swift Academy · บทเรียน

การผันรูปพหูพจน์และ Stringsdict

จัดการกฎพหูพจน์ในภาษาต่าง ๆ

บทเรียน 2 จาก 413 ขั้นตอน

การผันรูปพหูพจน์และ Stringsdict เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาพหูพจน์

ภาษาอังกฤษมีสองรูปแบบ — 1 item, 2 items — ดังนั้นนักพัฒนามักเขียน "\(n) item" + (n == 1 ? "" : "s") วิธีนี้ใช้ไม่ได้อย่างมาก เพราะภาษาอาหรับมีหมวดพหูพจน์หกหมวด ภาษารัสเซียมีสามหมวด และภาษาญี่ปุ่นมีหนึ่งหมวด การเขียนตรรกะพหูพจน์แบบฝังตายตัวคือจุดบกพร่องด้านการแปลที่รอวันเกิดขึ้น

// FRAGILE — only works for English
let n = 5
let bad = "\(n) item" + (n == 1 ? "" : "s")
print(bad)

หมวดพหูพจน์

Unicode กำหนดหมวดพหูพจน์ไว้ดังนี้: ศูนย์, หนึ่ง, สอง, น้อย, มาก, อื่น ๆ แต่ละภาษาจะใช้เพียงบางหมวด ระบบจะเลือกหมวดที่ถูกต้องสำหรับตัวเลขตามกฎของภาษาและการตั้งค่าภูมิภาค คุณไม่ต้องเขียนกฎเหล่านี้เอง

// English uses: one, other
// Russian uses: one, few, many, other
// Japanese uses: other (only)
// You provide a variant string per category needed.

รูปแบบพหูพจน์ในแค็ตตาล็อกสตริง

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

// Catalog entry, key "message_count":
//   one:   "You have %lld message"
//   other: "You have %lld messages"
let count = 1
let text = String(localized: "You have \(count) messages")
print(text)

ไฟล์ .stringsdict แบบดั้งเดิม

ก่อนมีแค็ตตาล็อกสตริง ข้อมูลพหูพจน์จะอยู่ในไฟล์ .stringsdict ซึ่งเป็นรายการคุณสมบัติที่จับคู่ key กับสตริงรูปแบบและรูปแบบย่อยของแต่ละหมวด คุณยังคงพบไฟล์เหล่านี้ในโปรเจกต์เก่า และไฟล์เหล่านี้ยังได้รับการรองรับอย่างเต็มรูปแบบ

// Localizable.stringsdict (plist) structure:
// key: "items_count"
//   NSStringLocalizedFormatKey: "%#@items@"
//   items: NSStringPluralRuleType
//     one:   "%lld item"
//     other: "%lld items"

ส่วนประกอบของรายการ stringsdict

แต่ละรายการมี key ของรูปแบบ ที่อ้างอิงตัวแปรที่มีชื่ออย่างน้อยหนึ่งตัว ซึ่งห่อหุ้มอยู่ใน %#@name@ ตัวแปรแต่ละตัวจะประกาศชนิดกฎ (NSStringPluralRuleType) ตัวระบุชนิดค่า (%lld) และสตริงหนึ่งรายการสำหรับแต่ละหมวดพหูพจน์

// The %#@items@ token expands to the chosen
// plural variant. %lld is the integer placeholder
// substituted inside each variant string.
let n = 3
print(String(localized: "\(n) items selected"))

การค้นหาสตริงรูปพหูพจน์

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

func messagesLabel(_ count: Int) -> String {
    return String(localized: "You have \(count) messages")
}
print(messagesLabel(0))
print(messagesLabel(1))
print(messagesLabel(7))

เหตุใด “หนึ่ง” จึงไม่ได้หมายถึงแค่ 1

ข้อผิดพลาดที่พบบ่อยคือการคิดว่าหมวดหมู่ หนึ่ง หมายถึงตัวเลข 1 เท่านั้น ในบางภาษาหมวดหมู่นี้ครอบคลุมตัวเลขที่ลงท้ายด้วย 1 (เช่น 21, 31) และ ศูนย์ อาจเป็นหมวดหมู่แยกต่างหากหรือไม่ก็ได้ ควรจัดเตรียมข้อความสำหรับแต่ละหมวดหมู่เสมอ แล้วปล่อยให้กฎเป็นผู้ตัดสิน

// Russian: 1, 21, 31 -> 'one'
//          2, 3, 4    -> 'few'
//          5..20, 0   -> 'many'
// Never assume one == 1.

การรวมรูปพหูพจน์เข้ากับค่าอื่น

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

let files = 2
let folder = "Photos"
let text = String(
    localized: "\(files) files in \(folder)")
// 'files' drives the plural; 'folder' is substituted as-is
print(text)

รูปแบบตามความกว้างและอุปกรณ์

กลไกแค็ตตาล็อกเดียวกันรองรับรูปแบบย่อยตาม อุปกรณ์ และ ความกว้าง ทำให้คุณแสดงป้ายกำกับสั้นบน Apple Watch และป้ายกำกับที่ยาวกว่าบน iPad หรือใช้คำย่อเมื่อมีพื้นที่จำกัดได้ รูปแบบเหล่านี้ทำงานร่วมกับรูปแบบย่อยตามจำนวนพหูพจน์

// Catalog can vary by:
//   plural: one / other
//   device: iPhone / iPad / watch
//   width:  short / medium / long
let label = String(localized: "Notifications")
print(label)

การทดสอบการผันพหูพจน์

หากต้องการตรวจสอบรูปแบบย่อย ให้เรียกใช้แอปในแต่ละภาษาเป้าหมายโดยใช้การแทนที่ภาษาของโครงร่างใน Xcode หรือใช้ภาษาจำลองและการแสดงตัวอย่างตามแต่ละ locale ตรวจสอบตัวเลขตรงขอบเขตบางส่วน ได้แก่ 0, 1, 2, 5, 11, 21 และ 100

let samples = [0, 1, 2, 5, 11, 21, 100]
for n in samples {
    print(String(localized: "\(n) items"))
}

แนวทางปฏิบัติที่ดี

เพื่อให้การผันพหูพจน์ถูกต้อง:

  • อย่านำข้อความมาต่อกันหรือกำหนดส่วนเติมท้าย s แบบตายตัว
  • จัดเตรียมทุกหมวดหมู่ที่ภาษาเป้าหมายต้องใช้
  • คำนวณรูปพหูพจน์จากจำนวนเต็มที่แทรกค่า ไม่ใช่จากสตริงที่คำนวณไว้ล่วงหน้า
  • ควรใช้แค็ตตาล็อกสตริงสำหรับโค้ดใหม่ และเก็บ .stringsdict ไว้เฉพาะเป้าหมายรุ่นเก่า
func cartSummary(_ items: Int) -> String {
    String(localized: "Your cart has \(items) items",
           comment: "Cart count; pluralized")
}
print(cartSummary(1))

ตรวจสอบอย่างรวดเร็ว

ทบทวนว่าควรจัดการการเลือกรูปพหูพจน์อย่างไร

สรุป

คุณได้เรียนรู้การผันพหูพจน์ให้ถูกต้องตาม locale:

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

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

คำถามที่พบบ่อย

บทเรียน “การผันรูปพหูพจน์และ Stringsdict” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การผันรูปพหูพจน์และ Stringsdict” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การผันรูปพหูพจน์และ Stringsdict”

จัดการกฎพหูพจน์ในภาษาต่าง ๆ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การผันรูปพหูพจน์และ Stringsdict” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แค็ตตาล็อกสตริงและสตริงแปลภาษา
  2. การผันรูปพหูพจน์และ Stringsdict
  3. การจัดรูปแบบตามโลแคล
  4. การเขียนจากขวาไปซ้ายและทิศทางการจัดวาง
← กลับไปที่ Swift Academy