กลับไปหน้าบทความ

อ่าน 6 นาที

รับข้อความ

ใน ด้านการคำนวณ gettext เป็น ระบบการ ทำให้เป็นสากลและการแปล (i18n และ l10n) ที่ใช้กันทั่วไปในการเขียนโปรแกรมหลายภาษาบน ระบบปฏิบัติการ คอมพิวเตอร์ แบบ Unix...

รับข้อความ

( เรียนรู้วิธีและเวลาในการลบข้อความนี้ )

รับข้อความ
ผู้เขียนต้นฉบับซัน ไมโครซิสเต็มส์[ 1 ]
นักพัฒนาหลากหลาย
ปล่อย1990 [ 2 ] ( 1990 )
เวอร์ชันเสถียร
1.0 [ 3 ] แก้ไขข้อมูลนี้บนวิกิดาต้า / 28 มกราคม 2026 ( 28 มกราคม 2569 )
ระบบปฏิบัติการข้ามแพลตฟอร์ม
พิมพ์การทำให้เป็นสากลและการปรับให้เข้ากับท้องถิ่น
ใบอนุญาตใบอนุญาตซอฟต์แวร์ฟรีประเภทต่างๆ
เว็บไซต์www.gnu.org/software/gettext/ แก้ไขข้อมูลนี้บนวิกิดาต้า
ที่เก็บข้อมูลต่างๆ ที่ใช้ OpenSolaris และ GNU gettext

ในด้านการคำนวณ gettext เป็นระบบการทำให้เป็นสากลและการแปล (i18n และ l10n) ที่ใช้กันทั่วไปในการเขียนโปรแกรมหลายภาษาบนระบบปฏิบัติการคอมพิวเตอร์แบบ Unixประโยชน์หลักอย่างหนึ่งของ gettext คือการแยกการเขียนโปรแกรมออกจากการแปล[ 4 ]การใช้งาน gettext ที่ใช้กันมากที่สุดคือGNU gettext [ 5 ] ซึ่งเผยแพร่โดยโครงการ GNUในปี 1995 ไลบรารีรันไทม์คือlibintl gettext มีตัวเลือกให้ใช้สตริงที่แตกต่างกันสำหรับ คำนามพหูพจน์จำนวนเท่าใดก็ได้แต่คุณสมบัตินี้ไม่รองรับเพศทางไวยากรณ์นามสกุลไฟล์หลักที่ใช้โดยระบบนี้คือ.POT (Portable Object Template), .PO (Portable Object) และ .MO (Machine Object) [ 6 ]

ประวัติศาสตร์

ในขั้นต้น POSIX ไม่ได้จัดเตรียมวิธีการกำหนดตำแหน่งข้อความไว้ มีการเสนอสองแนวทางในช่วงปลายทศวรรษ 1980 ได้แก่ Uniforum gettext ในปี 1988 และ X/Open catgets ในปี 1989 (XPG-3 § 5) Sun Microsystemsได้นำ gettext มาใช้เป็นครั้งแรกในปี 1993 [ 1 ]นักพัฒนา Unix และ POSIX ไม่เคยตกลงกันได้ว่าจะใช้อินเทอร์เฟซแบบใด (อีกทางเลือกหนึ่งคือ X/Open catgets) ดังนั้นไลบรารี C จำนวนมาก รวมถึงglibc จึง ได้นำทั้งสองแบบมาใช้[ 7 ]ณ เดือนสิงหาคม 2019 ประเด็นที่ว่า gettext ควรเป็นส่วนหนึ่งของ POSIX หรือไม่ยังคงเป็นหัวข้อถกเถียงในกลุ่ม Austinแม้ว่าศัตรูเก่าของมันจะเลิกใช้ไปแล้วก็ตาม ข้อกังวลที่ยกมาได้แก่ การพึ่งพา locale ที่ตั้งค่าโดยระบบ ( ตัวแปรส่วนกลางที่อาจก่อให้เกิดปัญหาในการทำงานแบบมัลติเธรด) และการสนับสนุนส่วนขยายภาษา C รุ่นใหม่ที่เกี่ยวข้องกับสตริงแบบกว้าง[ 8 ]

โครงการGNUตัดสินใจว่าวิธีการใช้ข้อความเป็นคีย์ของ gettext นั้นง่ายกว่าและเป็นมิตรมากกว่า (ระบบอื่นๆ ส่วนใหญ่ รวมถึง catgets ต้องการให้นักพัฒนาสร้างชื่อ "คีย์" สำหรับทุกสตริง) [ 9 ]พวกเขาได้ปล่อย GNU gettext ซึ่งเป็นการ ใช้งาน ซอฟต์แวร์ฟรีของระบบนี้ในปี 1995 [ 2 ]ตั้งแต่นั้นมา gettext ไม่ว่าจะเป็นของ GNU หรือไม่ ก็ได้ถูกพอร์ตไปยังภาษาโปรแกรมหลายภาษา[ 10 ]ความเรียบง่ายของ po และการสนับสนุนจากโปรแกรมแก้ไขที่แพร่หลายยังนำไปสู่การนำไปใช้ในบริบทที่ไม่ใช่โปรแกรมสำหรับเอกสารข้อความหรือเป็นตัวกลางระหว่างรูปแบบการแปลอื่นๆ โดยมีตัวแปลงเช่น po4a (po สำหรับทุกสิ่ง) และ Translate Toolkit เกิดขึ้นเพื่อให้เป็นสะพานเชื่อมดังกล่าว[ 11 ] [ 12 ]

การดำเนินการ

การเขียนโปรแกรม

ขั้นตอนการทำงานทั่วไปของ gettext ตัวอย่าง de.po ทางด้านซ้ายแสดงการ "ต่ออายุ" คำแปลผ่าน msgmerge

อินเทอร์เฟซพื้นฐานของ gettext คือgettext(const char*)ฟังก์ชัน ซึ่งรับสตริงที่ผู้ใช้จะเห็นในภาษาต้นฉบับ ซึ่งโดยปกติคือภาษาอังกฤษ เพื่อประหยัดเวลาในการพิมพ์และลดความยุ่งยากของโค้ด ฟังก์ชันนี้จึงมักถูกตั้งชื่อเล่นว่า_: [ 13 ]

printf ( gettext ( "My name is %s. \n " ), my_name ); printf ( _ ( "My name is %s. \n " ), my_name ); // เหมือนกัน แต่สั้นกว่า

gettext()จากนั้นจะใช้สตริงที่ให้มาเป็นคีย์สำหรับการค้นหาคำแปล และจะส่งคืนสตริงเดิมเมื่อไม่มีคำแปล ซึ่งแตกต่างจากPOSIXcatgets() [ 14 ] AmigaOS [ 15 ]หรือMicrosoft Windows ที่ใช้ ID แบบโปรแกรม (มักจะเป็นจำนวนเต็ม) ในการจัดการกรณีที่ข้อความภาษาต้นฉบับเดียวกันอาจมีความหมายต่างกัน gettext มีฟังก์ชันที่ยอมรับสตริง "บริบท" เพิ่มเติม GetString()LoadString()cgettext()

xgettextโปรแกรมนี้จะถูกเรียกใช้กับซอร์สโค้ดเพื่อสร้าง.potไฟล์ (Portable Object Template) ซึ่งประกอบด้วยรายการสตริงที่สามารถแปลได้ทั้งหมดที่ดึงมาจากซอร์สโค้ด ข้อความแสดงความคิดเห็นที่ขึ้นต้นด้วย `<script>` ///จะใช้เพื่อให้คำแนะนำแก่ผู้แปล แม้ว่าจะสามารถกำหนดค่าคำนำหน้าอื่นๆ เพื่อจำกัดขอบเขตเพิ่มเติมได้เช่นกัน คำนำหน้าทั่วไปอย่างหนึ่งคือ `<script> TRANSLATORS:`

ตัวอย่างเช่น ไฟล์อินพุตที่มีข้อความแสดงความคิดเห็นอาจมีลักษณะดังนี้:

/// ตัวแปล: %s ประกอบด้วยชื่อผู้ใช้ตามที่ระบุไว้ในการตั้งค่าprintf ( _ ( "ชื่อของฉันคือ %s. \n " ), my_name );

xgettextเรียกใช้งานโดยใช้คำสั่ง:

xgettext -c / 

ไฟล์ .pot ที่ได้จะมีลักษณะดังนี้ พร้อมข้อความแสดงความคิดเห็น (โปรดทราบว่า xgettext รู้จักสตริงนี้ว่าเป็น สตริงรูปแบบ printfของภาษาC ):

#. ตัวแปล: %s ประกอบด้วยชื่อผู้ใช้ตามที่ระบุไว้ในการตั้งค่า#, รูปแบบ c #: src/name.c:36 msgid "ชื่อของฉันคือ %s.\n" msgstr ""

ในสคริปต์เชลล์ POSIX gettext มีgettext.shไลบรารีที่สามารถรวมไว้ได้ ซึ่งมีฟังก์ชันมากมายที่ gettext มีในภาษาที่คล้ายกัน[ 16 ] GNU bashยังมีโครงสร้างที่เรียบง่าย$"msgid"สำหรับฟังก์ชัน gettext แบบง่าย แม้ว่าจะขึ้นอยู่กับไลบรารี C ในการจัดหาgettext()ฟังก์ชันก็ตาม[ 17 ]

การแปล

โปรแกรมแปลจะสร้าง.poไฟล์ (Portable Object) จากเทมเพลตโดยใช้msginitโปรแกรม จากนั้นจึงเติมคำแปล[ 18 ]msginitเริ่มต้นคำแปล ตัวอย่างเช่น สำหรับการแปลภาษาฝรั่งเศส คำสั่งที่จะเรียกใช้จะเป็น: [ 6 ]

msginit --locale=fr --input=name.pot 

ขั้น ตอนนี้จะสร้างfr.poไฟล์ขึ้นมา จากนั้นผู้แปลจะแก้ไขไฟล์ที่ได้มา ไม่ว่าจะด้วยตนเองหรือใช้เครื่องมือแปล เช่นPoeditหรือEmacsโดยใช้โหมดแก้ไข.poไฟล์ รายการที่แก้ไขแล้วจะมีลักษณะดังนี้:

#: src/name.c:36 msgid "My name is %s.\n" msgstr "Je m'appelle %s.\n"

ในที่สุดไฟล์ .po จะถูกคอมไพล์msgfmtเป็นไฟล์ไบนารี.mo(Machine Object) GNU gettext อาจใช้ส่วนขยายชื่อไฟล์ของตัวเอง.gmoบนระบบที่มีการใช้งาน gettext อื่น[ 19 ]ตอนนี้ไฟล์เหล่านี้พร้อมสำหรับการแจกจ่ายพร้อมกับแพ็คเกจซอฟต์แวร์แล้ว

GNU msgfmtยังสามารถทำการตรวจสอบบางอย่างที่เกี่ยวข้องกับสตริงรูปแบบที่ใช้โดยภาษาการเขียนโปรแกรมได้อีกด้วย นอกจากนี้ยังอนุญาตให้ส่งออกไปยังรูปแบบเฉพาะภาษาอื่นนอกเหนือจาก MO; [ 20 ]เทียบเท่า กับ X/Openคือgencat.

ในขั้นตอนต่อมาของกระบวนการพัฒนาmsgmergeสามารถใช้เพื่อ "อัปเดต" การแปลเก่าให้เข้ากับเทมเพลตใหม่กว่าได้ นอกจากนี้ยังมีฟังก์ชันmsgunfmtสำหรับการคอมไพล์ย้อนกลับของ.moไฟล์ และยูทิลิตี้อื่นๆ อีกมากมายสำหรับการประมวลผลแบบกลุ่ม

วิ่ง

บน ระบบปฏิบัติการแบบUnixผู้ใช้ จะตั้ง ค่าตัวแปรสภาพแวดล้อมLC_MESSAGESและโปรแกรมจะแสดงข้อความในภาษาที่เลือก หากมี.moไฟล์สำหรับภาษานั้นอยู่

ผู้ใช้บนระบบปฏิบัติการ GNUสามารถใช้ตัวแปรสภาพแวดล้อมLANGUAGEแทนได้เช่นกัน ความแตกต่างหลักจากตัวแปร Unix คือรองรับหลายภาษา โดยคั่นด้วยเครื่องหมายโคลอน เพื่อใช้เป็นตัวเลือกสำรอง[ 21 ]

รูปพหูพจน์

อินngettext()เทอร์เฟซนี้จะนับจำนวนคำนามในสตริง เช่นเดียวกับธรรมเนียม การใช้ gettext()`this` ในทางปฏิบัติมักจะใช้ชื่อย่อว่า `this` N_ลองพิจารณาตัวอย่างโค้ดต่อไปนี้:

// พารามิเตอร์: ภาษาอังกฤษเอกพจน์, ภาษาอังกฤษพหูพจน์, จำนวนเต็มprintf ( ngettext ( "%d ข้อความที่แปลแล้ว" , "%d ข้อความที่แปลแล้ว" , n ), n );

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

msgid "" msgstr "" "..." " ภาษา: sl\n" " รูปแบบพหูพจน์: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"

เนื่องจากตอนนี้มีรูปพหูพจน์สี่แบบ ดังนั้น po ตัวสุดท้ายจึงจะมีรูปแบบดังนี้:

#: src/msgfmt.c:876 #, c-format msgid "% d transed message " msgid_plural "%d แปลข้อความ" msgstr[ 0 ] "%d prevedenih sporočil" msgstr[ 1 ] "%d prevedeno sporočilo" msgstr[ 2 ] "%d prevedeni sporočili" msgstr[ 3 ] "%d พรีเวเดนา สปอโรชิลา"

กฎพหูพจน์อ้างอิงสำหรับภาษาต่างๆ จัดทำโดยกลุ่มUnicode [ 22 ] msginit ยังเติมกฎที่เหมาะสมเมื่อสร้างไฟล์สำหรับภาษาใดภาษาหนึ่งโดยเฉพาะ[ 18 ]

การนำไปใช้

นอกจากภาษาC แล้ว gettext ยังมีการใช้งานดังต่อไปนี้: C #สำหรับทั้งASP.NET [ 23 ] [ 24 ]และสำหรับWPF [ 25 ] Perl [ 26 ] PHP [ 27 ] Python [ 28 ] R [ 29 ] Scala [ 30 ]และNode.js [ 31 ]

GNU gettext รองรับ Objective-C โดยตรง แต่ยังไม่รองรับภาษาโปรแกรม Swiftการใช้งาน gettext ที่ใช้กันทั่วไปบนแพลตฟอร์ม Cocoa เหล่านี้คือ POLocalizedString [ 32 ]ทีม Microsoft Outlook สำหรับ iOS ยังมีไลบรารี LocalizedStringsKit ที่มี API คล้ายกับ gettext อีกด้วย[ 33 ]

ดูเพิ่มเติม

  • เว็บไซต์อย่างเป็นทางการของ GNU gettext
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Gettext&oldid=1323850607 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ รับข้อความ

ใน ด้านการคำนวณ gettext เป็น ระบบการ ทำให้เป็นสากลและการแปล (i18n และ l10n) ที่ใช้กันทั่วไปในการเขียนโปรแกรมหลายภาษาบน ระบบปฏิบัติการ คอมพิวเตอร์ แบบ Unix...

ประวัติศาสตร์

ในขั้นต้น POSIX ไม่ได้จัดเตรียมวิธีการกำหนดตำแหน่งข้อความไว้ มีการเสนอสองแนวทางในช่วงปลายทศวรรษ 1980 ได้แก่ Uniforum gettext ในปี 1988 และ X/Open catgets ในปี 1989 (XPG-3 § 5) Sun Microsystems ได้นำ gettext มาใช้เป็นครั้งแรกในปี 1993 [ 1 ] นักพัฒนา Unix และ...

การเขียนโปรแกรม

อินเทอร์เฟซพื้นฐานของ gettext คือ gettext(const char*) ฟังก์ชัน ซึ่งรับ สตริง ที่ผู้ใช้จะเห็นในภาษาต้นฉบับ ซึ่งโดยปกติคือภาษาอังกฤษ เพื่อประหยัดเวลาในการพิมพ์และลดความยุ่งยากของโค้ด ฟังก์ชันนี้จึงมักถูก ตั้งชื่อเล่น ว่า _ : [ 13 ]

การแปล

โปรแกรมแปลจะสร้าง .po ไฟล์ (Portable Object) จากเทมเพลตโดยใช้ msginit โปรแกรม จากนั้นจึงเติมคำแปล [ 18 ] msginit เริ่มต้นคำแปล ตัวอย่างเช่น สำหรับการแปลภาษาฝรั่งเศส คำสั่งที่จะเรียกใช้จะเป็น: [ 6 ]