gettext ระบบให้การสนับสนุนการแปลภาษาในโปรแกรมคอมพิวเตอร์
สรุปใจความสำคัญ
- gettext เป็นระบบ i18n และ l10n ที่แยกส่วนการเขียนโปรแกรมออกจากการแปลภาษาอย่างชัดเจน
- ไฟล์หลักที่ใช้ในระบบ gettext คือ .POT (เทมเพลต), .PO (คำแปล), และ .MO (ไฟล์ไบนารีสำหรับเครื่อง)
- GNU gettext เป็นการนำระบบนี้มาได้รรับความนิยมอย่างแพร่หลายหลังจากถูกปล่อยออกมาในปี 1995
ในโลกของการพัฒนาซอฟต์แวร์ gettext คือระบบการทำ Internationalization (i18n) และ Localization (l10n) ที่ได้รับความนิยมอย่างแพร่หลาย โดยเฉพาะในระบบปฏิบัติการตระกูล Unix-like ซึ่งช่วยให้นักพัฒนาสามารถสร้างโปรแกรมที่รองรับหลายภาษาได้อย่างมีประสิทธิภาพ
ประวัติความเป็นมา
ในช่วงปลายทศวรรษ 1980 มีข้อเสนอสองแนวทางในการจัดการข้อความในโปรแกรมให้รองรับหลายภาษา ได้แก่ Uniforum gettext (1988) และ X/Open catgets (1989) ต่อมา Sun Microsystems ได้นำ gettext มาใช้งานจริงในปี 1993
โครงการ GNU Project ได้เลือกใช้แนวทางของ gettext เพราะมีความเรียบง่ายและเป็นมิตรต่อผู้พัฒนามากกว่าระบบอื่น เนื่องจากนักพัฒนาไม่ต้องสร้าง "key" ชื่อเฉพาะสำหรับทุกข้อความ แต่สามารถใช้ข้อความต้นฉบับเป็นคีย์ได้เลย และได้ปล่อย GNU gettext ในปี 1995 ซึ่งต่อมาได้ถูกพอร์ตไปยังภาษาโปรแกรมมิ่งหลายภาษา
การทำงานของ gettext
การเขียนโปรแกรม (Programming)
อินเทอร์เฟซพื้นฐานของ gettext คือฟังก์ชัน gettext() ซึ่งจะรับค่าเป็นสตริง (string) ในภาษาต้นฉบับ (มักจะเป็นภาษาอังกฤษ) เพื่อความสะดวกและลดความซับซ้อนของโค้ด นักพัฒนามักจะสร้าง alias หรือชื่อเรียกสั้นๆ ว่า _()
ฟังก์ชัน gettext() จะใช้สตริงต้นฉบับเป็นคีย์ในการค้นหาคำแปลในไฟล์คำแปลภาษาต่างๆ หากไม่พบคำแปล จะส่งคืนค่าเป็นสตริงต้นฉบับ ซึ่งแตกต่างจากระบบอย่าง POSIX catgets() หรือ Microsoft Windows LoadString() ที่ใช้ ID ตัวเลขเป็นคีย์
การแปลภาษา (Translating)
กระบวนการแปลภาษาในระบบ gettext มีขั้นตอนดังนี้:
- .POT (Portable Object Template): ใช้โปรแกรม
xgettextเพื่อดึงข้อความที่ต้องแปลจากซอร์สโค้ดออกมาเป็นไฟล์เทมเพลต .pot - .PO (Portable Object): ผู้แปลจะใช้โปรแกรม
msginitเพื่อสร้างไฟล์ .po จากเทมเพลต .pot และให้ผู้แปลใส่คำแปลลงไปในไฟล์นี้ โดยอาจใช้เครื่องมืออย่าง Poedit หรือ Emacs - .MO (Machine Object): เมื่อแปลเสร็จแล้ว ไฟล์ .po จะถูกคอมไพล์ด้วย
msgfmtให้เป็นไฟล์ไบนารี .mo ซึ่งเป็นไฟล์ที่โปรแกรมจะเรียกใช้ในขณะทำงาน (runtime) เพื่อความรวดเร็วในการเข้าถึงข้อมูล
การรันโปรแกรม (Running)
ผู้ใช้ในระบบ Unix-type จะกำหนดค่าตัวแปรสภาพแวดล้อม (environment variable) LC_MESSAGES เพื่อเลือกภาษาที่ต้องการแสดงผล ซึ่งโปรแกรมจะดึงคำแปลจากไฟล์ .mo ที่ตรงกับภาษาที่นั้นๆ
การจัดการรูปพหูพจน์ (Plural Form)
gettext ได้รับการออกแบบมาให้รองรับการแปลรูปพหูพจน์ ซึ่งมีความซับซ้อนในแต่ละภาษา (เช่น ภาษาไทยไม่มีรูปพหูพจน์ที่ชัดเจน แต่บางภาษาอย่างภาษาสโลวีเนียมีถึง 4 รูปแบบ) โดยใช้ฟังก์ชัน ngettext() ซึ่งจะเลือกคำแปลที่เหมาะสมตามจำนวนนับของคำนามในข้อความ
คำถามที่พบบ่อย
gettext คืออะไร?
gettext เป็นระบบสำหรับการทำ Internationalization และ Localization ที่ช่วยให้นักพัฒนาสามารถให้การสนับสนุนหลายภาษาในโปรแกรมคอมพิวเตอร์ โดยแยกส่วนของโค้ดโปรแกรมออกจากข้อความที่แปลแล้ว
ไฟล์ .PO และ .MO ต่างกันอย่างไร?
ไฟล์ .PO เป็นไฟล์ข้อความที่มนุษย์อ่านและแก้ไขได้ ซึ่งผู้แปลจะใช้ใส่คำแปลลงไป ส่วนไฟล์ .MO เป็นไฟล์ไบนารีที่คอมไพล์มาจากไฟล์ .PO เพื่อให้โปรแกรมสามารถโหลดข้อมูลคำแปลได้รวดเร็วขึ้น
ฟังก์ชัน _() ใน gettext คืออะไร?
ฟังก์ชัน _() เป็น alias หรือชื่อเรียกสั้นๆ ที่เป็นธรรมเนียมปฏิบัติในการเขียนโปรแกรมด้วย gettext เพื่อใช้แทนฟังก์ชัน gettext() เพื่อให้โค้ดอ่านง่ายและลดความซับซ้อน
