← กลับไปยังบทความทั้งหมด

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() เพื่อให้โค้ดอ่านง่ายและลดความซับซ้อน