ตอนที่เริ่มต้นพัฒนาโปรแกรม ผมเคยถามตัวเองอยู่หลายครั้งว่า "ควรเผื่อให้ใช้หลายภาษาหรือไม่" แล้วก็คิดว่าคงไม่มีใครใช้หรอก หลังจากที่ชั่งน้ำหนักถึงความยุ่งยากโดยไม่จำเป็นกับทีมพัฒนาที่นำโปรแกรมไปต่อยอด เช่น สร้างรายงานหรือส่วนติดต่อกับผู้ใช้ ก็เลยไม่ทำดีกว่า
เพราะผู้ใช้โปรแกรมทั้งหมดอยู่ในประเทศไทย อีกทั้งเป็นโปรแกรมบัญชีและภาษีซึ่งเกี่ยวพันกับกฏหมายไทย รวมไปถึงวัฒนธรรมการทำธุรกิจแบบไทยๆ ผมก็เลยตัดสินใจเลือกไม่คิดเผื่อถึงการใช้งานหลายภาษา
ตัวอย่างของความเป็นไทย เช่น ระบบศักราช คุณอาจได้รับใบเสร็จรับเงินลงวันที่เป็นปี พ.ศ. 2567 หรือ ค.ศ. 2024 ก็ได้
ลองสังเกตดูปฏิทินของไทย แล้วคุณจะเห็นความซับซ้อนที่เราคุ้นชิน
เมื่อเอาบิลมาป้อนเข้าโปรแกรมที่รองรับระบบศักราชเดี่ยวเช่น ต้องใช้ปี ค.ศ. เท่านั้น หมายความว่า ผู้ใช้อาจไม่สามารถป้อนวันที่ตามที่ตามองเห็น ต้องตั้งสติแปลงเลขปี 2567 ให้เป็น 2024 ก่อน ยิ่งงานเอกสารปริมาณมากก็ยิ่งมีโอกาสผิดพลาดกับเรื่องเล็กน้อยเช่นนี้
เลขไทยที่ราชการนิยมใช้ ทำให้เรามีอักขระตัวเลขที่ไม่เหมือนกันในความเป็นข้อมูล "๐๑๒๓๔" ไม่เหมือน "01234" เมื่อต้องค้นหาในดาต้าเบส
ข้อมูลที่โอนมาจากระบบเก่าๆ อาจเจอเคาะวรรคไทย (ASCII 0xA0) ที่มองเห็นเหมือนเคาะวรรคทั่วไป (ASCII 0x20) จนกระทั่งสั่งค้นหาในดาต้าเบสแล้วไม่เจอ เพราะเป็นอักขระคนละตัว
แล้ววันนั้นก็มาถึง มีความต้องการให้ส่งมอบโปรแกรมพร้อมระบบงานที่เป็นภาษาอังกฤษ เพราะเป็นองค์กรที่มีชาวต่างชาติ (เป็นเจ้านาย) จึงจำเป็นต้องใช้ภาษาอังกฤษเป็นภาษากลางในการสื่อสารภายในองค์กร
ผมเชื่อว่าเส้นทางของโปรแกรมหลายตัวน่าจะเป็นไปคล้ายกัน เริ่มต้นจากฐานผู้ใช้ส่วนใหญ่ที่อยู่ในท้องถิ่น ใช้ภาษาท้องถิ่น (แค่สื่อสารระหว่างเซล การตลาด กับบัญชีก็ยากแล้ว) แล้ววันหนึ่งบังเอิญมีโอกาสได้ข้ามพรมแดนภาษา
Multi Language
โจทย์ที่ได้รับมามี 2 ประเด็นที่ไม่ได้ออกแบบเผื่อไว้ คือ ภาษาอังกฤษ และสกุลเงิน จะขอเล่าเฉพาะรายละเอียดเรื่องการปรับโปรแกรมให้เป็นภาษาอังกฤษก่อน
ความเข้าใจผิดแรกของผม จินตนาการไกลไปถึงโปรแกรมที่ผู้ใช้เลือกสลับเปลี่ยนภาษาตามต้องการได้ เช่น ใครถนัดภาษาไทยก็เลือกไทย ใครอ่านไทยไม่ออกก็เลือกอังกฤษ
แต่หัวหน้าเราอธิบายว่าโปรแกรมบัญชีหรือ ERP ไม่ใช่แอปส่วนตัวที่ใช้ตามความถนัด สำหรับองค์กรใดๆ การสื่อสารควรชัดเจนเป็นมาตรฐานเดียวกัน ไม่ใช่เรื่องเดียวกันคนไทยเรียกอย่างนึง ต่างชาติเรียกอีกอย่างหนึ่ง
สรุปว่า ไม่จำเป็นต้องเปิดให้ผู้ใช้เลือกเปลี่ยนภาษาเอง
ถึงแม้ทำโปรแกรมให้ใช้ได้หลายภาษา แต่การนำไปให้องค์กรใดใช้ควรเป็นภาษาเดียวกันทั้งองค์กร แต่ก็มีข้อยกเว้นสำหรับโหมดพัฒนาวางระบบ เพื่อความสะดวกจะต้องสลับเปลี่ยนภาษาได้
สรุปสุดท้ายว่า ยังต้องทำโปรแกรมสลับเปลี่ยนภาษาได้ แต่ซ่อนไว้ไม่ให้ผู้ใช้เลือก
Translation File
การออกแบบรองรับหลายภาษาในอนาคต กระบวนท่ามาตรฐาน จะต้องแยกไฟล์แปลภาษาออกมาต่างหาก และภายในโปรแกรมจะต้อง Text ID หรืออาจเป็น reference text ซึ่งควรใช้ภาษาอังกฤษ เพื่อความสะดวกในการแปลเป็นภาษาอื่น ใครอยากแปลภาษาอะไรก็เอาไฟล์ต้นแบบไปแปลหรือปรับเปลี่ยนได้
ข้อเสียของวิธีนี้ โปรแกรมที่ใช้ภาษาไทยเป็นหลักกลายเป็นงานเพิ่มทันที เพราะไม่สามารถใช้ reference text เป็นภาษาไทย กลายเป็นต้องทำเป็นภาษาอังกฤษก่อน แล้วใช้ไฟล์แปลภาษาไทย
สรุปว่าแนวทางนี้ ต้องปรับโปรแกรมให้ใช้ Native Language เป็น English แล้วทำไฟล์แปลภาษาไทยอีกทีหนึ่ง
Translate API
เราสามารถต่อยอดจากการใช้ไฟล์แปลภาษา กรณีไม่พบคำแปล โดยการขอคำแปลจาก Translate API ได้อีกด้วย แต่ข้อเสียคือ ช้า อาจจะต้องออกแบบระบบให้สามารถอัพเดทเข้าไฟล์แปลภาษาอัตโนมัติได้ด้วย กลายเป็นความซับซ้อนเพิ่มเข้ามาอีก
Translation library
ระหว่างที่หาข้อมูลว่าโปรแกรมอื่นทำอย่างไร ก็เจอกับ Polyglot.js ที่ออกแบบให้ผนวกกลไกการแปลภาษาให้ใช้งานได้สะดวก สามารถเขียนโค้ดเพิ่มเพื่อโหลดไฟล์แปลภาษาตามต้องการได้
หลังจากที่พิจารณาถึงเงื่อนไขต่างๆ รวมทั้งข้อจำกัดทางด้านเวลา จึงตัดสินใจว่าเก็บแผน multi language เอาไว้ก่อน รอจนกว่าจะมีความต้องการใช้ภาษาอื่น
Bi Language
ระหว่างไม่จำกัดภาษากับแค่สองภาษา ความยากง่ายในการออกแบบต่างกันมหาศาล
หากใช้ไม่จำกัดภาษา จะต้องทำรายการข้อความที่ใช้ เพื่อนำไปใช้อ้างอิงสำหรับทุกภาษา โปรแกรมควรเป็นภาษาอังกฤษตั้งแต่ต้น
ด้วยข้อจำกัดดังกล่าว ทำให้ผมเลือกวิธีทำเป็นสองภาษา เพราะมีข้อดีอย่างน้อย 2 ประการ
ประการแรก ภาษาไทย ยังคงเป็น first class language ของโปรแกรมเหมือนเดิม ทำให้งานเดิมไม่ต้องแก้ไขใด ๆ
ประการที่สอง การรองรับภาษาทางเลือกจึงเป็นงานเพิ่มเฉพาะส่วนที่จำเป็นต้องใช้ภาษาที่สองเท่านั้น
หากแนวคิดที่ว่าสำหรับองค์กรใดๆ จะใช้เพียงภาษาใดภาษาหนึ่งถูกต้องแล้ว ก็ไม่จำเป็นต้องทำโปรแกรมให้เลือกเปลี่ยนภาษาอิสระ หมายความว่าทำเท่าที่จำเป็นต้องใช้
ผมลอกไอเดีย pluralization ของ Polyglot มาทำกลไกแปลภาษาแบบฉาบฉวย แต่น่าจะอธิบายให้ทีมพัฒนาเข้าใจง่ายที่สุด จากข้อความภาษาไทยเดิมสามารถเพิ่มให้เป็นภาษาอังกฤษโดยใช้ function กับ special text ตามตัวอย่างดังนี้
เดิม (ภาษาไทย)
<label>วันที่</label>
ใหม่ (สองภาษา)
<label>{{ utils._lbl_("วันที่ :::: Date") }}</label>
กลไกของวิธีนี้ เพิ่มเพียงฟังก์ชั่นเดียว ที่รู้ว่าโปรแกรมที่ใช้งานอยู่ตั้งค่าไว้เป็นภาษาอะไร "th" หรือ "en" แล้วตัดเลือกข้อความส่วนที่ต้องการ
Number Localization
เชื่อว่าหลายคน (รวมทั้งผมด้วย) มักสับสนระหว่าง Language กับ Locale เพราะบางครั้งภาษาเดียวกัน ต้องแยกย่อยรายละเอียดบางอย่างไม่เหมือนกัน
คำว่า "Billion" อาจมีความหมาย พันล้าน หรือ ล้านล้าน ก็ได้ ขึ้นอยู่ว่าใช้ที่ไหน
ทศนิยม ประเทศในยุโรปส่วนใหญ่ ใช้ decimal comma เช่น 1.234,50 ประเทศที่ใช้ภาษาอังกฤษส่วนใหญ่ รวมทั้งประเทศไทยด้วยใช้ decimal point 1,234.50 ดังนั้นเราจึงเรียกว่า "จุดทศนิยม" ไม่ใช่ "ลูกน้ำทศนิยม"
ภาษาอังกฤษกับท้องถิ่นไทย จึงเหลือเพียงข้อความของตัวเลขที่ต้องแปลง ขณะที่ความซับซ้อนจะอยู่ที่ money text หรือข้อความจำนวนเงิน หากจำเป็นต้องรองรับ multi-currency ที่ไม่ได้มีแค่ บาท-สตางค์ (BAHT-SATANG)
Date Localization
สำหรับภาษาอังกฤษ นอกจากชื่อวันและเดือนเป็นอังกฤษแล้ว ระบบศักราชก็ควรเป็น ค.ศ. ด้วย
ส่วนภาษาไทย ผมนิยามว่าเป็นระบบศักราชคู่ สามารถเลือกใช้ ค.ศ. หรือ พ.ศ. ก็ได้
ความซับซ้อนของวันที่อยู่ที่ date format ที่เรียงเลขซ้ายไปขวา DMY หรือ MDY หรือ YMD ต่างกัน ดังที่กล่าวมาแล้ว ประเทศที่ใช้ภาษา (language) อังกฤษเหมือนกันอาจใช้ date format ต่างกันได้
ความละเมียดละไมจึงอยู่ที่ความเข้าใจมิติที่ทับซ้อนกัน ระหว่าง present (แสดงให้มนุษย์อ่าน), input (รับค่าจากภายนอก) และ store (ใช้แลกเปลี่ยนและประมวลผลในคอมพิวเตอร์) ซึ่งใช้ความเข้มงวดและยืดหยุ่นต่างกัน
Report and Printed Form
สุดท้าย การทำโปรแกรมให้ใช้ภาษาอะไร เป็นเรื่องของ user interface ส่วนที่ติดต่อกับผู้ใช้ อาจไม่เกี่ยวกับ output เช่น รายงาน หรือ ฟอร์มเอกสาร ที่ใช้ติดต่อสื่อสารกับบุคคลที่ไม่ใช้โปรแกรม
โปรแกรมภาษาไทย อาจพิมพ์ฟอร์มเอกสารบางอย่างเป็นอังกฤษ หรือมีรายงานบางรายงานที่ต้องส่งให้ต่างประเทศ
โปรแกรมภาษาอังกฤษ อาจต้องออกใบหักภาษีหรือมีรายงานที่ใช้ติตต่อกับราชการเป็นภาษาไทยก็ได้
ไม่ว่าจะใช้ได้ภาษาเดียวหรือหลายภาษา อย่างน้อยโปรแกรมก็ควรรองรับรายงานและฟอร์มเอกสารเป็นภาษาอื่นได้ก่อน
อ้างอิง
moment/dev-thai
Polyglot
Points or Commas?
Billion
Date Format
Comments