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

ปัญหาที่เกิดเมื่อการแปลไม่ได้ถูกจัดการ
การแปลที่ไม่ได้มีเวิร์กโฟลว์มักล้มเหลวแบบเล็ก ๆ ที่น่ารำคาญก่อน แล้วค่อยกลายเป็นปัญหาใหญ่มีค่าใช้จ่ายสูงต่อมา ป้ายที่พอดีเมื่อวานกลายเป็นล้นเมื่อวันนี้ คีย์หายแสดงเป็นตัวระบุดิบ ๆ และพหูพจน์ที่ฟังดีในภาษาอังกฤษอาจผิดหรือแม้แต่หยาบคายในภาษาอื่น
ทีมส่วนใหญ่จบลงด้วยการแก้ปัญหาเดิม ๆ ภายใต้ความกดดัน:
- ปุ่มถูกตัด หัวเรื่องถูกตัด หรือข้อความทับไอคอน
- คีย์หายที่ fallback เป็นภาษาอังกฤษหรือโชว์ชื่อคีย์
- รูปแบบพหูพจน์ผิด (เช่น "1 items") และไวยากรณ์พังในภาษาที่มีการเพศของคำ
- คำศัพท์ไม่สอดคล้องสำหรับแนวคิดเดียวกันข้ามหน้าจอ
- การแก้ด่วนในนาทีสุดท้ายเพราะหน้าจอหนึ่งปล่อยโดยไม่มีคำแปล
หน้าจอเว็บและเนทีฟมักพังต่างกัน บนเว็บ เลย์เอาต์ยืดหยุ่นอาจซ่อนปัญหาจนกว่าจะเจอ viewport หรือเบราว์เซอร์เฉพาะ ข้อความอาจขึ้นบรรทัดไม่คาดคิด กระแทกปุ่มลง หรือทำให้กริดแตก ในแอปเนทีฟ พื้นที่มีความเข้มงวดมากกว่า การแปลยาว ๆ อาจดันองค์ประกอบสำคัญออกจากหน้าจอ ชนกับขนาดฟอนต์เพื่อการเข้าถึง หรือถูกตัดเพราะคอมโพเนนต์ไม่ปรับขนาดเอง
เวิร์กโฟลว์โลคอลไลเซชันที่มั่นคงป้องกันปัญหาเหล่านี้ได้ส่วนใหญ่โดยทำให้คีย์นิ่ง การแปลสามารถตรวจทานได้ และการตรวจเช็ค UI เป็นเรื่องปกติ มันช่วยให้คุณปล่อยอัปเดตโดยมีความประหลาดใจน้อยลง สิ่งที่มันแก้ไม่ได้คือข้อความต้นทางที่ไม่ชัดเจน ถ้าข้อความต้นทางกำกวม (เช่น "Open" หรือ "Apply" โดยไม่มีบริบท) การแปลก็ยังเป็นการคาดเดา
คำนิยามง่าย ๆ ของความสำเร็จไม่ใช่ "ทุกอย่างถูกแปล" แต่คือ:
- UI อ่านได้ข้ามเว็บและเนทีฟ
- การอัปเดตเร็วเพราะคีย์ไม่เปลี่ยนบ่อย
- QA พบปัญหาก่อนผู้ใช้
ตัวอย่าง: ถ้าหน้ารถเข็นโชว์ "{count} item(s)" สตริงที่ไม่ได้จัดการนำไปสู่พหูพจน์ที่ประหลาดและช่องว่างที่พัง วิธีจัดการบังคับกฎพหูพจน์ที่ถูกต้องและจับปุ่มที่จะยาวขึ้น 30% ในภาษาเยอรมันก่อนปล่อย
กำหนดผู้รับผิดชอบและแหล่งข้อมูลเดียวที่เชื่อถือได้
เวิร์กโฟลว์การแปลล่มเร็วที่สุดเมื่อไม่มีใครตอบคำถามเดียวได้ว่า: “ข้อความไหนคือต้นฉบับจริง?” เลือกแหล่งข้อมูลเดียวสำหรับสตริงและทำให้ชัดเจนมากจนไม่น่าเถียง แหล่งนั้นอาจเป็นไฟล์ในรีโป แพลตฟอร์มแปล หรือเทเบิลภายใน แต่ต้องเป็นที่เดียวที่ชนะทุกข้อถกเถียง
กำหนดบทบาทตามการตัดสินใจ ไม่ใช่ชื่อตำแหน่ง ใครสักคนต้องอนุมัติความหมายและโทน (มักเป็น Product หรือ Marketing) ใครสักคนต้องดูแลคีย์ให้ใช้งานได้ในโค้ด (มักเป็น Engineering) ใครสักคนต้องปกป้องข้อจำกัดของ UI (มักเป็น Design) โดยเฉพาะเมื่อเว็บและเนทีฟทำงานต่างกัน
การแบ่งงานแบบหนึ่งที่หลีกเลี่ยงความขัดแย้งได้มาก:
- ผู้สร้างคีย์: คนที่ส่งหน้าจอเป็นคนสร้างคีย์ใหม่เมื่อ UI ต้องการข้อความใหม่
- ผู้อนุมัติคำ: PM หรือเจ้าของคอนเทนต์เซ็นรับข้อความในภาษาต้นทาง
- บรรณาธิการการแปล: นักแปลแก้แปลงค่าการแปลได้ แต่ไม่สามารถเปลี่ยนชื่อคีย์ได้
- การเปลี่ยนคีย์: เฉพาะเจ้าของคีย์เท่านั้นที่สามารถเลิกใช้หรือรวมคีย์ พร้อมบันทึกเหตุผล
ตั้งความคาดหวังเรื่องเวลาในการตอบกลับเพื่อไม่ให้การปล่อยเวอร์ชันหยุดชะงัก ตัวอย่าง: คำขอคีย์ใหม่รับทราบภายใน 1 วันทำการ การอนุมัติข้อความต้นทางภายใน 2 วัน และการแก้ไขด่วน (UI พัง ข้อความกฎหมายผิด) ภายในไม่กี่ชั่วโมง
ตัวอย่างเป็นรูปธรรม: ทีมของคุณสร้างฟลว์ “รีเซ็ตรหัสผ่าน” ใหม่ทั้งเว็บและเนทีฟ นักพัฒนาจะเพิ่มคีย์ PM อนุมัติข้อความภาษาอังกฤษสุดท้าย และนักแปลเติมภาษาต่าง ๆ ถ้านักแปลสังเกตว่าควรใช้ “Change” แทน “Reset” เขาจะอัปเดตการแปล แต่คีย์ก็ยังเหมือนเดิม ถ้า PM ต้องการนำข้อความไปใช้ซ้ำข้ามหน้าจอ เจ้าของคีย์เท่านั้นที่ทำการเปลี่ยนเชิงโครงสร้างได้เพื่อไม่ให้มีอะไรพังโดยเงียบ ๆ
ยุทธศาสตร์คีย์: การใช้ซ้ำ ความนิ่ง และขอบเขตหน้าจอ
เวิร์กโฟลว์ที่ดีเริ่มจากกฎข้อหนึ่ง: คีย์คือไอดี ไม่ใช่ประโยคภาษาอังกฤษ ปฏิบัติเหมือนหมายเลขชิ้นส่วน หากคุณเปลี่ยนข้อความทีหลัง คีย์โดยปกติควรคงเดิม
สร้างคีย์ใหม่เมื่อความหมายต่างกัน ใช้ซ้ำคีย์เมื่อความหมายเหมือนกัน แม้หน้าจอจะแตกต่างกัน “บันทึก” ในหน้าประวัติส่วนตัวและ “บันทึก” ในหน้าการตั้งค่า สามารถใช้คีย์เดียวกันได้ถ้าทั้งสองหมายถึง “เก็บการเปลี่ยนแปลง” แต่ถ้า “บันทึก” หมายถึง “บุ๊กมาร์ก” ควรเป็นคีย์ต่างหากเพราะนักแปลอาจต้องใช้กริยาที่ต่างกัน
แยกป้าย UI สั้น ๆ ออกจากเนื้อหาที่ยาวกว่า ป้ายปุ่ม คำช่วย และข้อความข้อผิดพลาดมักแปลต่างกันและมีข้อจำกัดความยาวต่างกัน การแยกคีย์ช่วยปรับโทนและเครื่องหมายวรรคตอนโดยไม่ทำให้หน้าจออื่นพัง
ขอบเขตหน้าจอโดยไม่บังคับวลีเหมือนกัน
ตั้งเป้าใช้ซ้ำข้ามเว็บและเนทีฟ แต่ไม่ต้องบังคับหากแพลตฟอร์มต้องการภาษาที่ต่างกัน คำขอสิทธิ์เนทีฟมักต้องชัดเจนและเป็นทางการกว่าทิปบนเว็บ ในกรณีนั้นให้เก็บแนวคิดเดียวกันแต่ใช้คีย์เฉพาะแพลตฟอร์มเพื่อให้แต่ละ UI อ่านเป็นธรรมชาติ
รูปแบบใช้งานที่ปฏิบัติได้คือจัดกลุ่มคีย์ตามฟีเจอร์และประเภท UI แล้วใช้ซ้ำภายในขอบเขตเหล่านั้น:
- ใช้ซ้ำภายในฟีเจอร์เดียวกันเมื่อความหมายตรงกัน
- แยกคีย์ตามประเภท UI (ป้าย vs คำช่วย vs ข้อความผิดพลาด vs ไดอะล็อกระบบ)
- ใช้คีย์เวอร์ชันแพลตฟอร์มเมื่อต้องการวลีที่ต่างกัน
- รักษาคีย์ให้นิ่งและเปลี่ยนเฉพาะข้อความที่แสดง
- เพิ่มหมายเหตุบริบท (ปรากฏที่ไหน ข้อจำกัดตัวอักษร)
เช่น การกระทำ “ลบลูกค้า” อาจมีทั้งในพอร์ทัลเว็บแอดมินและแอปฟิลด์เนทีฟ คุณอาจใช้คีย์หลักเดียวกันสำหรับป้ายการกระทำ แต่เก็บคีย์แยกสำหรับข้อความยืนยันเนทีฟถ้าต้องเตือนชัดเจนขึ้นหรือบรรทัดสั้นกว่า
การตั้งชื่อและจัดระเบียบคีย์การแปล
ระบบการตั้งชื่อที่ดีทำให้การแปลเป็นเรื่องน่าเบื่อในทางที่ดี ผู้คนหาสตริงได้เร็ว นักแปลได้บริบท และคีย์นิ่งแม้คัดลอกจะเปลี่ยน
ใช้คอนเวนชันที่อ่านง่ายและตอบคำถามสี่ข้อ: อยู่ที่ไหน มันคืออะไร ใช้ทำอะไร และเป็นเวอร์ชันหรือไม่ รูปแบบง่าย ๆ ที่ใช้ได้ทั้งเว็บและเนทีฟคือ:
<product_or_domain>.<screen_or_flow>.<component>.<purpose>[.<variant>]
ตัวอย่างในพอร์ทัลลูกค้า: portal.login.button.submit หรือ portal.orders.empty_state.title ทำให้คีย์ถูกจัดกลุ่มตามหน้าจอหรือฟลูว์และยังค้นหาได้ง่ายตามคอมโพเนนต์
คีย์ที่ไม่ดีมักกำกวมเกินไปหรือผูกกับประโยคภาษาอังกฤษปัจจุบัน:
- ดี:
portal.profile.field.email.label - แย่:
emailText(ไม่มีขอบเขต ไม่มีเจตนา) - แย่:
please_enter_your_email(พังเมื่อคัดลอกเปลี่ยน) - ดี:
portal.checkout.error.payment_failed - แย่:
error_12
เวอร์ชันควรชัดเจน ไม่ควรใช้เครื่องหมายวรรคตอนหรือการตั้งชื่อตลก ถ้าต้องการป้ายสั้นสำหรับหัวเรื่องมือถือ ให้เพิ่ม suffix variant: ...title.short vs ...title.long ถ้าต้องการความแตกต่างของการใช้ตัวพิมพ์ ให้สร้างคีย์แยกเช่น ...button.save และ ...button.save_titlecase เฉพาะเมื่อแพลตฟอร์มไม่สามารถแปลงข้อความได้อย่างปลอดภัย
ตัวแทน (placeholders) ต้องมีกฎเพื่อไม่ให้นักแปลเดา
- ใช้ตัวแทนแบบมีชื่อ:
{user_name},{count},{date} - ห้ามต่อสตริง: อย่าสร้างสตริงแบบ "Hello " + name
- เก็บหน่วยภายในสตริงเมื่อขึ้นกับภาษา:
{count} itemsไม่ใช่{count}+ " items" - กำหนดรูปแบบที่อนุญาต: วันที่แบบ ISO สกุลเงิน หรือการฟอร์แมตตามแพลตฟอร์ม
- เพิ่มหมายเหตุสั้น ๆ สำหรับสตริงที่ยุ่งยาก (เช่น
{count}อาจเป็นศูนย์ได้หรือไม่)
พหูพจน์และกฎไวยากรณ์ที่ลดงานแก้ซ้ำ
พหูพจน์คือจุดที่เวิร์กโฟลว์มักแตก หลายทีมคิดว่าภาษาแต่ละภาษามีแค่ “หนึ่ง” กับ “หลาย” แล้วพบว่า UI ฟังแปลกหรือต้องแก้ด่วน
บางภาษามีหลายหมวดพหูพจน์ ภาษาอังกฤษใช้ mostly one/other แต่ภาษารัสเซีย โปแลนด์ อาหรับ เช็ก อาจมี few, many, zero เป็นต้น ถ้าคุณฝังรูปแบบเดียวตั้งแต่ต้น คุณจะต้องเขียนสตริงซ้ำทั้งเว็บและเนทีฟทีหลัง
เลือกมาตรฐานหนึ่งสำหรับสตริงพหูพจน์และยึดตามมันทุกที่ (เว็บ, iOS, Android, ข้อความที่เรนเดอร์จากแบ็กเอนด์) แนวปฏิบัติที่ดีคือเก็บคีย์เดียวพร้อมฟอร์มพหูพจน์ แทนการมีคีย์แยกตามรูปแบบ ใช้ชุดฟอร์มตาม CLDR เพื่อให้ตรงกับกฎภาษาจริง
กฎที่ป้องกันงานซ้ำ: อย่าสร้างประโยค UI จากชิ้นส่วนเช่น "You have " + count + " messages" เพราะลำดับคำเปลี่ยนได้และบางภาษาต้องการลงท้ายหรือกรณีพิเศษตามตัวเลข
รูปแบบคีย์ที่ปฏิบัติได้
สำหรับตัวนับข้อความ ให้กำหนดคีย์นิ่งเดียวและใส่ตัวเลขเป็นพารามิเตอร์ แล้วให้ฟอร์มที่นักแปลต้องการสำหรับแต่ละภาษา
- ใช้คีย์หนึ่งอันต่อแนวคิด (ตัวอย่าง:
inbox.message_count) - รองรับฟอร์ม CLDR (zero, one, two, few, many, other)
- ใช้ตัวแทนเสมอ (เช่น
{count}) ในประโยคเต็ม - เพิ่มหมายเหตุสำหรับนักแปลเมื่อความหมายไม่ชัด (คือ "messages" หรือ "unread messages"?)
เพศและกรณีไวยากรณ์
บางครั้งกฎพหูพจน์ยังไม่พอ ถ้า UI เรียกหาคน ("Welcome, Alex") หรือกล่าวถึงบทบาท ("assigned to him/her") บางภาษาต้องใช้คำต่างตามเพศ หรือบางภาษาเปลี่ยนคำลงท้ายตามกรณีไวยากรณ์
เมื่อเกิดเหตุเช่นนี้ ให้สร้างสตริงแยกสำหรับไวยากรณ์ที่ต่างกันจริง ๆ ไม่ใช่แค่สไตล์ เป้าหมายคือลดจำนวนคีย์ แต่ก็ลดความประหลาดใจใน QA เมื่อการแปล "ถูกต้อง" แต่ยังอ่านผิดในบริบท
ข้อจำกัดการจัดรูปและเลย์เอาต์ข้ามแพลตฟอร์ม
การแปลอาจถูกต้องแต่ยังทำให้ UI พัง เว็บและแอปเนทีฟเรนเดอร์ข้อความต่างกัน ดังนั้นเวิร์กโฟลว์ควรรวมกฎการฟอร์แมตและการเช็คเลย์เอาต์ ไม่ใช่แค่สตริงที่แปลแล้ว
ทำมาตรฐานการแสดงตัวเลข เงิน และวันที่ หลีกเลี่ยงการต่อข้อความแบบ "$" + amount หรือการฝังรูปแบบวันที่ในป้าย ใช้การฟอร์แมตตามโลเคลเพื่อให้ตัวคั่นและลำดับถูกต้อง (1,000.50 vs 1 000,50; วัน-เดือน-ปี vs เดือน-วัน-ปี) โซนเวลาเป็นกับดักทั่วไป: เก็บ timestamp เป็น UTC ฟอร์แมตตามโซนของผู้ใช้ และระบุชัดเมื่อเวลามีโซนเฉพาะ
ทิศทางข้อความเป็นตัวทำลายเงียบ ๆ ถ้าคุณรองรับภาษาเขียนขวาไปซ้าย (RTL) ให้วางแผนการมิเรอร์เลย์เอาต์และเครื่องหมายวรรคตอนที่อาจ "เคลื่อน" ไอคอนที่สื่อทิศทางมักต้องพลิก ทำการตรวจ RTL แบบเร็ว ๆ แม้คุณจะยังไม่รองรับ RTL เต็มรูปแบบ
บนมือถือ ฟอนต์และการเว้นวรรคเปลี่ยนมากกว่าบนเว็บ สตริงที่พอดีในเว็บอาจขึ้นบรรทัดแปลกใน SwiftUI หรือ Kotlin กำหนดขนาดฟอนต์ขั้นต่ำที่ปลอดภัย อนุญาตให้ป้ายห่อบรรทัดเมื่อตรรกะยอมได้ และกำหนดฟอนต์สำรองสำหรับสคริปต์ที่ฟอนต์หลักของคุณไม่รองรับ
การเข้าถึงต้องมีการตรวจสอบที่แปลแล้วด้วย เครื่องอ่านหน้าจออาจอ่านตัวเลข อักษรย่อ และข้อความผสมภาษาต่างออกไป
แนวทางการออกแบบเลย์เอาต์ที่ป้องกันปัญหาส่วนใหญ่:
- ออกแบบให้รองรับการขยายข้อความ (30–50%) และหลีกเลี่ยงปุ่มความกว้างคงที่
- เก็บค่าตัวแปรไดนามิก (จำนวน ราคา วันที่) เป็นโทเคนที่ฟอร์แมตแล้วแยกต่างหาก
- ใช้ตัวฟอร์แมตวันที่และตัวเลขของแพลตฟอร์ม ไม่ใช่แพทเทิร์นแบบกำหนดเอง
- ทดสอบหนึ่งโลเคล RTL และหนึ่งโลเคลที่มีข้อความยาวก่อนปล่อย
- รันการตรวจ screen-reader สำหรับฟลว์หลัก (ล็อกอิน ชำระเงิน ตั้งค่า)
ตัวอย่าง: ป้าย "Total: $1,234.50" อาจต้องกลายเป็น "1 234,50 €" โดยสัญลักษณ์อยู่หลังค่าจำนวน มีช่องว่างต่างกัน และต้องมีการหยุดให้เครื่องอ่านหน้าจออ่านระหว่าง "Total" กับจำนวน
ขั้นตอนทีละขั้นจากหน้าจอใหม่ถึงการปล่อยเวอร์ชัน
เวิร์กโฟลว์การแปลต้องเริ่มเร็วกว่าที่ทีมคาด: ตั้งแต่หน้าจอยังอยู่ในขั้นออกแบบ หากรอจน UI "เสร็จ" คุณจะต้องรีบแปล ส่งข้อความถูกตัด หรือฝังสตริงไว้ชั่วคราว
เริ่มด้วยการเพิ่มคีย์แปลเมื่อออกแบบแต่ละป้าย ปุ่ม และข้อความ โดยเขียนข้อความเริ่มต้นในภาษาฐานและแนบบริบทสั้น ๆ เช่นที่ปรากฏและการกระทำที่เกิดขึ้น คีย์อย่าง checkout.pay_button มีประโยชน์เมื่อผู้แปลรู้ว่ามันเป็นคำกริยา ("Pay") หรือป้ายชื่อ ("Payment")
นำ UI ไปใช้งานโดยใช้ตัวแทนและให้ภาษาพื้นฐานเป็น fallback ชัดเจน เก็บตัวแปรให้ชัด (เช่น {name} หรือ {count}) และหลีกเลี่ยงการเย็บประโยคเข้าด้วยกัน นั่นเป็นวิธีที่เร็วที่สุดในการทำลายไวยากรณ์ข้ามภาษา
เมื่อส่งสตริงให้แปล ให้รวมสิ่งที่นักแปลต้องการ: สกรีนช็อตต่อหน้าจอ (หรือวิดีโอสั้น ๆ ถ้าข้อความเปลี่ยน) ข้อจำกัดตัวอักษรสำหรับจุดแคบ ๆ (แท็บ ปุ่ม แบนเนอร์) หมายเหตุเรื่องโทนและคำศัพท์ และรายการตัวแทนไดนามิกพร้อมคำอธิบาย
เมื่อได้การแปลกลับมา ให้รวมเร็วและสร้างทั้งเวอร์ชันเว็บและเนทีฟ ทำการเช็ค UI แบบเร็วในหน้าจอความเสี่ยงสูง: ล็อกอิน onboarding ชำระเงิน และการตั้งค่า มองหาข้อความถูกตัด องค์ประกอบทับ คีย์หาย และรูปแบบพหูพจน์ผิด
สุดท้าย ปล่อยแล้วติดตาม เก็บสถิติคีย์หาย เหตุการณ์ fallback เป็นค่าพื้นฐาน และหน้าจอที่ข้อความล้นบ่อย ๆ
ให้เครื่องมือนักแปลมีสิ่งที่ต้องการเพื่อแปลอย่างแม่นยำ
การแปลที่แม่นยำเริ่มก่อนคำแรกถูกแปล หากนักแปลเห็นแค่คีย์และประโยคภาษาอังกฤษ พวกเขาจะเดา นั่นคือสาเหตุที่ได้คำถูกที่ผิดที่ และ UI รู้สึกประหลาดหรือไม่สุภาพ
"แพ็กบริบท" ง่าย ๆ ลบการเดาเกือบทั้งหมด สำหรับทุกสตริง ให้เพิ่มว่าปรากฏที่ไหน (หน้าจอและคอมโพเนนต์) ผู้ใช้กำลังพยายามทำอะไร และโทน (เป็นมิตร เป็นทางการ ด่วน) แจ้งด้วยว่านี่คือปุ่ม ข้อความผิดพลาด เมนู หรือคำช่วย เพราะแต่ละประเภทแปลต่างกัน
เมื่อพื้นที่จำกัด ให้บอกตั้งแต่แรก เว็บและเนทีฟแตกต่างกัน วิธีที่สตริงจะพังต่างกัน ดังนั้นกำหนดขีดจำกัดเมื่อสำคัญ: ป้ายปุ่มสั้น ๆ ชื่อแท็บ ข้อความ toast และข้อความภายในการ์ดคงที่ ถ้าสตริงต้องอยู่ในบรรทัดเดียว ให้ระบุ ถ้าพับบรรทัดได้ ให้บอกตำแหน่งที่ปลอดภัย
ระบุชัดเจนส่วนที่ห้ามแปล ชื่อผลิตภัณฑ์ แผน ราคา โค้ดคูปอง ฟิลด์ API และตัวแทนเช่น {name} ต้องคงอยู่ ถ้าไม่ระบุ นักแปลอาจแปลและทำให้แอปอ่านไม่ออก
แพ็กปฏิบัติสำหรับแต่ละสตริง:
- สกรีนช็อตหรือชื่อหน้าจอ (เช่น: "Checkout - Payment method")
- ประเภทและเจตนา (ปุ่มยืนยันการชำระเงิน)
- หมายเหตุโทน (ใจเย็น ให้ความมั่นใจ)
- ข้อจำกัด (สูงสุด 18 อักขระ บรรทัดเดียว)
- โทเคนที่ไม่แปล (ชื่อผลิตภัณฑ์
{amount})
จัดการข้อความทางกฎหมายและคอนเทนต์ซัพพอร์ตเป็นสตรีมแยกต่างหาก ข้อความกฎหมายมักมีข้อกำหนดการอนุมัติและการอัปเดตช้ากว่า จึงเก็บแยกและมีเวอร์ชัน ใบทความซัพพอร์ตมักต้องการการแปลยาวโดยสามารถอยู่ในระบบหรือชุดไฟล์ต่างหาก
ตัวอย่าง: ปุ่ม "Continue" บนมือถืออาจต้องจำกัดมากกว่าเว็บ ถ้านักแปลรู้ พวกเขาจะเลือกคำกริยาที่สั้นกว่าในภาษาที่ขยายแทนการรีดีไซน์ทีหลัง
วงจร QA และการทบทวนที่ป้องกัน UI พัง
ปัญหา UI จากการแปลไม่ค่อยดูเหมือน "บั๊ก" ตอนแรก มันดูเหมือนป้ายหาย ปุ่มขึ้นบรรทัดสอง หรือแสดงตัวแทนผิด เวิร์กโฟลว์ที่ดีรวมขั้นตอน QA ที่เปิดปัญหาเหล่านี้ก่อนผู้ใช้เห็น
เริ่มด้วย pseudo-localization ในบิลด์พัฒนา แทนที่สตริงจริงด้วยเวอร์ชันยาวและมีอัศเจรีย์/อักขระaccent (เช่น "[!!! Šéttïñĝš !!!]") และเพิ่มความยาว 30–50% จะเปิดเผยการถูกตัด การทับ และสตริงฝังทั้งบนเว็บและเนทีฟ
เพิ่มเช็กอัตโนมัติในทุกบิลด์ พวกมันจับข้อผิดพลาดน่าเบื่อที่คนมักพลาดเมื่อดูหลายร้อยบรรทัด:
- คีย์หายในทุกโลเคล (fallback มักซ่อนปัญหา)
- คีย์ที่ไม่ได้ใช้ (สัญญาณว่ามีสตริงตาย)
- ความไม่ตรงกันของตัวแทน ("Hello, {name}" vs "Hello, {username}")
- รูปแบบพหูพจน์ไม่ถูกต้องสำหรับโลเคล
- แพทเทิร์นต้องห้ามเช่น raw HTML ในสตริงมือถือ
แล้วใช้ลูปเซ็นชื่อแบบแมนนวลที่ชัดเจน Product ตรวจความหมายและโทนสำหรับหน้าจอสำคัญ ขณะที่ QA ตรวจเลย์เอาต์และอินเตอร์แอ็กชัน
เก็บเมทริกซ์การทดสอบให้เล็กแต่เข้ม งดทดสอบทุกอย่าง ให้ทดสอบสิ่งที่พังก่อน: ล็อกอิน/สมัคร รหัสผ่าน ชำระเงินหรือยืนยันการชำระ ค่าตั้งค่าและแก้ไขโปรไฟล์ การแจ้งเตือนและ empty states และหน้าจอที่มีตาราง แบนเนอร์ หรือปุ่มเล็ก
เมื่อรายงานปัญหา ทำให้การแก้ไขทำได้ง่ายโดยระบุให้ชัดเจน รวมโลเคล อุปกรณ์และเวอร์ชัน OS (หรือเบราว์เซอร์และความกว้าง) ข้อความที่คาดหวัง ข้อความจริง และสกรีนช็อตที่โชว์พื้นที่ถูกตัด หากเกี่ยวกับพหูพจน์หรือตัวแทน ให้วางคีย์และสตริงที่เรนเดอร์จริง
ความผิดพลาดทั่วไปและวิธีเลี่ยง
บั๊กการแปลส่วนใหญ่ไม่ใช่ "ปัญหาการแปล" แต่เป็นปัญหาเวิร์กโฟลว์ที่ปรากฏเป็น UI พัง ข้อความหาย หรือข้อความสับสน
กับดักทั่วไปคือการเปลี่ยนชื่อคีย์ในเมื่อคุณต้องการเปลี่ยนแค่ข้อความ คีย์ควรนิ่งเป็นไอดี ไม่ใช่ข้อความ ถ้าคุณเปลี่ยน checkout.button.pay เป็น checkout.button.pay_now การแปลเก่าทั้งหมดจะกลายเป็น "หาย" และคุณจะเสียประวัติ รักษาคีย์ไว้ อัปเดตข้อความภาษาฐาน และเพิ่มบริบทถ้าความหมายเปลี่ยน
อีกปัญหาพบบ่อยคือฝังสตริงบนแพลตฟอร์มหนึ่ง ทีมเว็บใช้คีย์ แต่ทีมมือถือใส่ข้อความตรงเพื่อแก้ชั่วคราว เดือนถัดมา ผู้ใช้เห็นแจ้งเป็นภาษาอังกฤษบน iOS ทำให้ตั้งกฎ "ห้ามฝังสตริงที่ผู้ใช้เห็น" สำหรับทั้งเว็บและเนทีฟร่วมกัน
ตัวแทนทำให้เกิดปัญหาเมื่อคุณสมมติลำดับคำ ภาษาอังกฤษทำงานกับ "{count} items" แต่ภาษาบางภาษาอาจต้องลำดับต่างหรือคำเพิ่ม ใช้ตัวแทนแบบมีชื่อ (ไม่ใช้ตำแหน่ง) และให้เหมือนกันข้ามแพลตฟอร์ม
ข้อผิดพลาดที่ควรจับตั้งแต่ต้น:
- ถือคีย์เป็นไอดี อย่าใช้คีย์เป็นข้อความและทำให้การแปลเดิมหาย
- ใช้คีย์เดียวสำหรับความหมายสองแบบ ให้แยกเมื่อเจตนาต่างกัน
- ผสมสไตล์ตัวแทน (บางที่มีชื่อ บางที่เป็นตัวเลข) ให้มาตรฐานเดียว
- ทดสอบเฉพาะภาษาอังกฤษไม่ได้ ให้ตรวจอย่างน้อยหนึ่งโลเคลข้อความยาวและหนึ่งโลเคลข้อความกะทัดรัด
- ปล่อยโดยไม่มีแผน fallback กำหนดว่าจะเกิดอะไรเมื่อคีย์หาย
การทดสอบแค่ภาษาเดียวที่มีข้อความยาวไม่พอ เยอรมันมักขยาย UI ในขณะที่จีนอาจซ่อนปัญหาช่องว่าง ทำการตรวจทั้งสองแบบและทดสอบกรณีพหูพจน์เช่น 0, 1, 2
ตกลงพฤติกรรม fallback ก่อนปล่อย ตัวอย่าง: หากฝรั่งเศสหาย ให้ fallback เป็นอังกฤษ ล็อกคีย์หาย และบล็อกการปล่อยเฉพาะหน้าจอสำคัญเท่านั้น
เช็คลิสต์ด่วนและขั้นตอนถัดไปที่ทำได้จริง
เวิร์กโฟลว์การแปลรักษาได้เมื่อตรวจสอบเล็ก ๆ ทำได้บ่อย จุดประสงค์คือ: สตริงไม่ประหลาดใจ เลย์เอาต์ไม่พัง การแก้คำฉุกเฉินน้อยลง
ก่อน merge การเปลี่ยน UI ให้ตรวจแบบเร็วสำหรับข้อผิดพลาดทั่วไป:
- คีย์ใหม่เป็นไปตามกฎการตั้งชื่อและอยู่ในเนมสเปซที่ถูกต้อง (หน้าจอหรือฟีเจอร์)
- ตัวแทนตรงกันข้ามภาษาต่าง ๆ (ตัวแปรเหมือนกัน ความหมายเดียวกัน)
- ฟอร์มพหูพจน์ครบถ้วนสำหรับภาษาที่รองรับ (ไม่ใช่แค่เอกพจน์/พหูพจน์ของอังกฤษ)
- ไม่มีข้อความฝังใน UI (รวมข้อความผิดพลาด และ empty states)
- ข้อความใหม่หรือที่เปลี่ยนมีบริบทพื้นฐาน (สกรีนช็อตหรือหมายเหตุชัดเจน)
ก่อนปล่อย ให้รัน QA ปล่อยสั้น ๆ มุ่งที่จุดที่การแปลพังก่อน: ฟลว์หลักทุกแพลตฟอร์ม การตรวจ RTL อย่างน้อยหนึ่งจุด หน้าจอข้อความยาว (การตั้งค่า กฎหมาย onboarding ตาราง ปุ่มแคบ) และการฟอร์แมตวันที่/ตัวเลข/สกุลเงินในบางโลเคล
ตั้งรอบเวลาที่เหมาะกับทีม ทีมหลายทีมอัปเดตการแปลเป็นรายสัปดาห์ แล้ว freeze สตริง 1–2 วันก่อนปล่อย จุดประสงค์คือหลีกเลี่ยงการผสมการแก้คำด่วนกับ QA สุดท้าย
ขั้นตอนถัดไปที่คุ้มค่า: เขียนกฎของคุณลง (การตั้งชื่อคีย์ ตัวแทน กฎพหูพจน์ ความเป็นเจ้าของ) แล้วรันหน้าต้นแบบหนึ่งหน้าจอครบวงจรและปรับตามที่พัง
ถ้าคุณสร้างข้ามแบ็กเอนด์ เว็บ UI และมือถือในแพลตฟอร์มเดียวเช่น AppMaster จะง่ายกว่าที่จะรักษาคีย์และตัวแทนให้สอดคล้อง เพราะหน้าจอและตรรกะเดียวกันสามารถแชร์คอนเวนชันเดียว การรักษาคอนเวนชันนั้นให้นิ่งคือสิ่งที่ทำให้การโลคอลไลเซชันเป็นเรื่องปกติ ไม่ใช่เปราะบาง。
คำถามที่พบบ่อย
เริ่มจากที่เดียวที่เก็บสตริงอย่างนิ่ง กำหนดกฎการตั้งชื่อคีย์เดียว และกฎว่าคีย์ไม่ถูกเปลี่ยนแปลงเพียงเพราะข้อความภาษาอังกฤษเปลี่ยน แล้วเพิ่มขั้นตอน QA เล็ก ๆ เพื่อตรวจหาคีย์หาย ข้อความล้น และปัญหาพหูพจน์ก่อนปล่อยเวอร์ชัน
เลือกระบบเดียวที่เป็นแหล่งข้อมูลหลักเมื่อเกิดความขัดแย้ง เช่น ไฟล์ในรีโปหรือแพลตฟอร์มแปล และระบุให้ชัดเจนว่าทุกคนแก้ไขผ่านที่นั้น ส่วนโค้ดดึงข้อมูลจากที่นั่นเท่านั้น
กำหนดการตัดสินใจตามความรับผิดชอบ ไม่ใช่ตำแหน่ง: ใครสักคนอนุมัติความหมายและโทนภาษาในภาษาต้นทาง ใครสักคนดูแลโครงสร้างคีย์และการเลิกใช้ และนักแปลแก้เฉพาะค่าการแปลเท่านั้น วิธีนี้ลดการเปลี่ยนชื่อคีย์เงียบ ๆ และการแก้คำในนาทีสุดท้ายที่ทำให้บิลด์พัง
สร้างคีย์ใหม่เมื่อความหมายเปลี่ยน แม้ข้อความภาษาอังกฤษจะคล้ายกันก็ตาม ให้ใช้คีย์เดียวกันเมื่อความหมายตรงกันจริง ๆ เพราะจะช่วยให้การแปลสอดคล้องและลดงานบำรุงรักษา
ใช้คีย์เป็นตัวระบุ ไม่ใช่ประโยคภาษาอังกฤษ และใส่ขอบเขตเช่น ฟีเจอร์ หน้าจอ/ฟลว์ คอมโพเนนต์ และจุดประสงค์ เช่น portal.checkout.button.pay จะยังคงใช้ได้เมื่อข้อความบนปุ่มเปลี่ยนในอนาคต
พหูพจน์ล้มเหลวเพราะหลายภาษามีมากกว่าแค่เอกพจน์กับพหูพจน์ เก็บคีย์เดียวต่อแนวคิดพร้อมรูปแบบพหูพจน์ตาม CLDR และใส่ {count} ไว้ในประโยคเต็มเพื่อให้ผู้แปลจัดลำดับคำได้ถูกต้อง
อย่าสร้างประโยคด้วยการต่อชิ้นส่วนเช่น "Hello " + name เพราะลำดับคำและคำลงท้ายอาจเปลี่ยน ใช้ตัวแทนแบบมีชื่อเช่น {user_name} ให้เหมือนกันทุกที่และเขียนบันทึกว่าตัวแทนแต่ละตัวหมายถึงอะไร
คาดว่าข้อความจะยาวขึ้นประมาณ 30–50% และออกแบบคอมโพเนนต์ให้ขยายหรือขึ้นบรรทัดได้เมื่อเหมาะสม จากนั้นทดสอบหนึ่งภาษา "ข้อความยาว" และขนาดตัวอักษรเพื่อการเข้าถึงทั้งบนเว็บและเนทีฟ เพื่อจับการตัดและการทับซ้อนเร็ว
ทำ pseudo-localization ในการพัฒนาเพื่อเปิดเผยสตริงที่ถูกฝังและปัญหาเลย์เอาต์ จากนั้นเพิ่มเช็กอัตโนมัติในการบิลด์เพื่อตรวจหาคีย์หาย คีย์ไม่ได้ใช้ ความไม่ตรงกันของตัวแทน และรูปแบบพหูพจน์ที่ผิดพลาด ให้การรีวิวแบบแมนนวลมุ่งที่ฟลว์ที่พังก่อน เช่น การล็อกอิน การชำระเงิน และการตั้งค่า
กําหนด fallback เป็นภาษาฐานแล้วล็อกคีย์ที่หายเพื่อให้แก้ไขได้เร็วโดยไม่ต้องบล็อกทุกการปล่อยเวอร์ชัน แต่สำหรับหน้าจอสำคัญหรือข้อความทางกฎหมาย ควรบล็อกการปล่อยถ้าแปลไม่ครบหรือเก่ามาก


