ทำเว็บ ทำแอป ให้รองรับหลายภาษา หลากวัฒนธรรม

ไลบรารี/เฟรมเวิร์กสำหรับการทำให้แอป/เว็บไซต์รองรับหลายภาษา/วัฒนธรรม หรือที่เรียกว่า “internationalization” ทั้งส่วนหน้าตาและการประมวลผลอื่นๆ เช่น เรียงลำดับตามพจนานุกรม ปฏิทิน รูปแบบวันเวลา สกุลเงิน

โพสต์เรื่องนี้ไปที่กรุ๊ปสมาคมโปรแกรมเมอร์ไทยและใน Medium ขอโพสต์ซ้ำที่นี่

อะไรคือ Internationalization?

หลักๆ ในเรื่องนี้มี 2 คำ คือ internationalization (i18n) กับ localization (L10n)

ส่วนของโค้ดจะเป็นการทำ internationalization รองรับไว้ คือเตรียมให้รองรับหลายภาษา/วัฒนธรรม ไม่ hardcode ภาษาลงในโค้ด คนเขียนโค้ดไม่ทึกทักเรื่องเกี่ยวกับภาษาและวัฒนธรรมไปเอง

สำหรับข้อความ/ข้อมูลสำหรับแต่ละภาษาแต่ละประเทศจะเก็บเป็นก้อนๆ เอาไว้ เรียกว่า locale

การจัดเตรียมข้อมูล locale พวกนี้เรียกว่า localization ซึ่งมีทั้งการแปลข้อความ และการเตรียมข้อมูลที่เจาะจงกับประเทศ/เขตการปกครอง/วัฒนธรรม

(ตัวย่อ i18n และ L10n มาจากอักษรแรกสุด+จำนวนตัวอักษรระหว่างอักษรแรกสุดกับอักษรท้ายสุด+อักษรท้ายสุด ใช้ i ตัวเล็ก และ L ตัวใหญ่ เพื่อให้เห็นแตกต่างจากเลขหนึ่ง 1)

ข้อมูลจำเพาะท้องถิ่น (locale)

ข้อความที่เจาะจงกับแอปในภาษานั้นๆ ก็ต้องแปลเอา ซึ่งมีเครื่องมือให้ช่วยแปลผ่านเว็บหลายตัว ตัวที่นิยมกันมากคือ Transifex (ใช้ฟรีสำหรับโครงการโอเพนซอร์ส) หรือจะใช้โปรแกรมอื่นๆ ก็มี โดยมาตรฐานการเก็บข้อความอันหนึ่งก็คือ gettext

ส่วนข้อมูลที่เป็นพื้นฐานสำหรับแต่ละภาษาแต่ละประเทศ ที่ไม่ขึ้นกับแอป มีคนทำเอาไว้แล้วที่โครงการ Unicode Common Locale Data Repository (CLDR)

เฟรมเวิร์กเกือบทั้งหมดรองรับการดึงข้อมูลจาก CLDR นี้ (และเราไม่ควรคิดใช้อะไรที่ต่างไปจาก CLDR ถ้าไม่ชัวร์จริงๆ ว่าคิดดีแล้ว)

ชื่อเรียก locale มีมาตรฐานกำหนดวิธีเรียกไว้ อยู่ในรูปแบบ:

  • รหัสภาษาตัวพิมพ์เล็ก_รหัสประเทศตัวพิมพ์ใหญ่
  • รหัสภาษาตัวพิมพ์เล็ก-รหัสประเทศตัวพิมพ์ใหญ่

เช่น th_TH คือภาษาไทยที่ใช้ในประเทศไทย, en_GB คือภาษาอังกฤษที่ใช้ในสหราชอาณาจักร, en_MY ภาษาอังกฤษที่ใช้ในมาเลเซีย, my_MM “ภาษาเมียนมาร์” ที่ใช้ในประเทศเมียนมาร์

รหัสภาษาและรหัสประเทศ​ โดยทั่วไปแล้วจะใช้ตามมาตรฐาน ISO ซึ่งจะมีทั้งแบบ 2 ตัวอักษร และแบบ 3 ตัวอักษร — โปรดสังเกตว่า รหัสภาษาและรหัสประเทศอาจจะแตกต่างกัน เช่น ภาษาญี่ปุ่นคือ ja ส่วนประเทศญี่ปุ่นคือ JP, หรือ MY ถ้าเป็นประเทศคือมาเลเซีย แต่ถ้าภาษา my คือ “ภาษาในเมียนมาร์”

บางทีเราจะเห็นชื่อ locale ในรูปแบบ รหัสภาษา_รหัสประเทศ_รหัสประเทศ อันนี้ต้องไปอ่านเอกสารของเฟรมเวิร์กนั้นๆ อีกทีว่าหมายความว่าอะไร เพราะมันไม่ใช่มาตรฐาน

เช่น th_TH_TH ใน Java จะหมายถึง ภาษาไทย, ในประเทศไทย, และใช้เลขไทยด้วย หรือ ja_JP_JP จะหมายถึง ภาษาญี่ปุ่น, ในประเทศญี่ปุ่น, และใช้การนับปีปฎิทินแบบญี่ปุ่น (Imperial calendar)

(ภาษาบางภาษาไม่มีโค้ดแบบ 2 ตัวอักษร แต่มีโค้ดแบบ 3 ตัวอักษร เช่น bur คือภาษาพม่า)

การทำงานของโค้ดที่ถูก internationalized แล้ว

ในการทำงานของโค้ด หลังจากโค้ดทราบภาษา/ประเทศของผู้ใช้ (จากที่ผู้ใช้ตั้งค่าเอง หรือจากการ detect/เดา หรือใช้ค่าจากระบบปฏิบัติการ) ตัวโค้ดก็จะไปดึงข้อมูลที่ตรงกันมาใช้ เพื่อกำหนดการแสดงผลหรือประมวลผล

เช่นถ้าทราบว่าเป็นผู้ใช้ภาษาอังกฤษ (en) ที่อยู่ในประเทศไทย (TH) ก็จะโหลด locale en_TH ขึ้นมาใช้ ซึ่งในการทำงานก็เป็นไปได้ว่า หน้าจอจะแสดงเป็นภาษาอังกฤษ แต่วันหยุดต่างๆ ใช้ตามปฏิทินของไทย

ส่วนข้อความที่แสดงผล (บนหน้าเว็บหรือทางอื่น) ตัวเฟรมเวิร์กจะกำหนดวิธีการแยกตัวโค้ดกับข้อความออกจากกัน ทำให้เราจัดการกับส่วนข้อความได้สะดวกขึ้น

โค้ดสามารถโหลดข้อมูล locale ได้จากทั้งฐานข้อมูล ใน string array ใน JSON หรือในแฟ้มต่างหาก อันนี้ก็ต้องไปตัดสินใจกันว่าทำงานแบบไหนสะดวกกว่า

i18n Library / Framework

ไลบรารี/เฟรมเวิร์กสำหรับ JavaScript ที่พบตอนนี้มีดังนี้

มีคนทำตารางเปรียบเทียบไว้ https://github.com/rxaviers/javascript-globalization/blob/master/README.md

สำหรับ PHP มีคนแนะนำวิธีต่างๆ ไว้ https://lingohub.com/blog/2013/06/php-internationalization-i18n-mechanisms-tutorial/

สำหรับ Ruby on Rails มีตัวนี้อีกตัว https://github.com/fnando/i18n-js คุณ Vittayasak Rujivorakul แนะนำมา

จบดื้อๆ แค่นี้ มีอะไรไปคุยกันได้ในเฟซบุ๊กกรุ๊ป สมาคมโปรแกรมเมอร์ไทย ครับ https://www.facebook.com/groups/ThaiPGAssociateSociety/

โพสต์(อาจจะ)ที่เกี่ยวข้อง

Consumer information security tools – Thai localization 2017 summary

การแปลโปรแกรมรักษาความปลอดภัยในการใช้คอมใช้เน็ต สำหรับผู้ใช้ทั่วไป สรุปสิ้นปี 2017

Thanks COCONET: Southeast Asia Digital Rights Camp and Localization Lab for a localization sprint this year for Thai, Bahasa Indonesia, Burmese, and Khmer. Events like that help volunteer translators get connected to people who close to developers, and it helps the translation submission goes more smooth.

รอผู้พัฒนาดำเนินการต่อ

แปล 100% รีวิว 100% รอให้าทางผู้พัฒนาทดสอบการใช้งานในแอป

A chart showing that Signal on Android 100% translated to Thai

ยังแปลไม่เสร็จ

รอให้ทางโครงการเพิ่มภาษาไทย

  • Gpg4win ชุดโปรแกรมสำหรับเข้ารหัสลับแบบ PGP (Windows)
    https://www.gpg4win.de/localize-gpg4win.html

    • มีโปรแกรมย่อยอีก 4 ตัวคือ GnuPG (โปรแกรมเข้ารหัสลับ), Kleopatra (โปรแกรมจัดการกุญแจ), GpgOL (ปลั๊กอินสำหรับ Outlook – เข้ารหัสลับอีเมล), GpgEx (ปลั๊กอินสำหรับ Windows Explorer – เข้ารหัสลับแฟ้ม)
    • อาจจะมีทางให้ Localization Lab ช่วยจัดการให้แปลผ่าน Transifex ได้

     

  • GPG Suite ชุดโปรแกรมสำหรับเข้ารหัสลับแบบ PGP (macOS) — Update 2018-01-05: เปิดให้แปลภาษาไทยได้แล้ว
    https://www.transifex.com/gpgtools/public/

    • มีโปรแกรมย่อยอีก 4 ตัวคือ libmacgpg (โปรแกรมเข้ารหัสลับ), GPG Keychain (โปรแกรมจัดการกุญแจ), GPGMail (ปลั๊กอินสำหรับ Mail.app), GPGPerferences (ส่วนการตั้งค่า)

     

  • Orbot, Orfox แอปช่วยเข้าถึงเน็ตอย่างเป็นส่วนตัวมากขึ้น (Android)
    https://www.transifex.com/otf/orbot/ (เทียบได้กับ Tor) — Update 2018-01-10: เปิดให้แปลภาษาไทยได้แล้ว
    https://www.transifex.com/otf/orfox/ (เทียบได้กับ Tor Browser)

สำหรับโปรแกรมที่อยู่บน Transifex แล้ว ใครสนใจช่วยแปล สามารถสมัครสมาชิก Transfex (ฟรี) แล้วไปที่หน้าโครงการ กด Join Team ได้เลยครับ — ถ้าโปรแกรมเหล่านี้เป็นภาษาไทย ก็มีโอกาสที่คนไทยจะสามารถใช้โปรแกรมช่วยความปลอดภัยเหล่านี้ได้มากขึ้นครับ

สวัสดีปีใหม่ 2018 ทุกท่าน ขอให้เป็นปีที่ปลอดภัย คิด ทำ พูด ได้อย่างมั่นใจ 🙂

[27 ก.ค.] ตะลุยแปล #Tor เป็นไทย เสาร์นี้

แปล Tor เป็นไทย

ชวนชาวเน็ตมาช่วยแปลโปรแกรม Tor เป็นภาษาไทยกันครับ 🙂

เสาร์ 27 กรกฎา ประมาณ 10 โมงเช้าไปจนถึง 5 โมงเย็น
ที่ร้านกาแฟ Tom N Toms สยามเซ็นเตอร์ [Facebook event]

Tor (The Onioin Router) เป็นโปรแกรมที่ช่วยให้เราใช้งานอินเทอร์เน็ตได้ปลอดภัยขึ้น และลดโอกาสการถูกดักฟังขโมยข้อมูลจากผู้ไม่หวังดี มีวิธีการใช้ไม่ยุ่งยากนัก แต่อุปสรรคสำคัญอย่างหนึ่งสำหรับผู้ไม่คุ้นเคยคือ หน้าจอโปรแกรมยังเป็นภาษาอังกฤษอยู่ ซึ่งการแปลเป็นไทย ก็จะช่วยให้คนอีกมากเข้าอินเทอร์เน็ตได้อย่างปลอดภัยครับ

การแปลนั้นไม่ยุ่งยาก ทุกคนทำได้ผ่านหน้าเว็บ ไม่ต้องลงโปรแกรมอะไรเพิ่มเติม มีทั้งแปลคำในเมนู ซึ่งจะเป็นคำสั้นๆ หรือแปลข้อความในส่วนต่างๆ ของโปรแกรม ซึ่งก็เป็นประโยคเดียวบ้างหรือเป็นย่อหน้าก็มี เราเลือกได้ครับ

โดยรวมตอนนี้แปลไปแล้ว 46% และยังรอตรวจคำแปลอยู่อีกครับ

มากกว่าการแปล, localization คือการปรับเข้าถิ่น

ผมเริ่มงานแรกหลังเรียนจบตรี ในอุตสาหกรรมซอฟต์แวร์ (จริงๆ เริ่มก่อนจบน่าจะสามเดือนได้ ซึ่งงานนี่ก็เกือบทำให้ไม่จบ :p) งานที่ทำอยู่ในหมวด “software localization” หรือเรียกย่อๆ ว่า L10n (L ตามด้วยอักษรอีกสิบตัว ปิดท้ายด้วย n)

software localization ไม่ใช่แค่การแปลซอฟต์แวร์ให้ใช้ภาษาถิ่น แต่ต้องปรับให้เข้ากะท้องถิ่น (locale) ด้วย

เช่น มาตรฐานเข้ารหัสและจัดเก็บตัวอักษร (ยูนิโค้ด สมอ. ASCII JIS)

การจัดเรียงลำดับข้อมูล (เอาอะไรมาก่อนหลัง พยัญชนะ สระ วรรณยุกต์ ตัวไหนสำคัญกว่าตอนเรียง)

ระบบปฏิทิน (ศักราช การนับวันแรกของสัปดาห์ วิธีเรียกวัน การเขียนวันที่เอาวันหรือเดือนมาก่อน วันหยุดประจำปี เวลา 24 ชั่วโมงหรือ am/pm เขตเวลา ปรับเวลาออมแสงเมื่อใด)

ระบบจำนวนและระบบนับ (เลขไทย เลขอารบิค การออกเสียงจำนวน “211 -> สองร้อยสิบเอ็ด” การรันเลขรายการ “๑) ๑.๑) ๑.๑.ก)” เครื่องหมายบอกหลัก “1,000.00 vs 1.000,00”)

หน่วยชั่งตวงวัด (อิมพีเรียลหรือเมตริก ใช้กระดาษแบบ Letter หรือ A4) หน่วยเงิน (บาท-สตางค์ ดอลลาร์-เซนต์)

รูปแบบการเขียนชื่อ คำนำหน้า ที่อยู่ ไปรษณีย์ เลขหมายโทรศัพท์

เครื่องหมาย สัญลักษณ์พื้นฐาน สี (ถูก-ผิด ใช่-ไม่ใช่ O X / อัญประกาศเปิดปิด) และอีกมาก

บางเรื่องเป็นเรื่องที่สามารถทำได้เลย ไม่ต้องเข้าไปแก้ไขตัวโปรแกรม แต่บางเรื่องก็จำเป็นต้องไปปรับโปรแกรมให้มันรองรับเสียก่อน

เมื่อก่อนโปรแกรมจำนวนมากถูกออกแบบมาโดยไม่คำนึงถึงการทำตลาดในวัฒนธรรมอื่นๆ ทำให้ยากที่จะปรับ บางทีก็ต้องแงะงัด เสียเวลามากและไม่ยั่งยืน เพราะพอโปรแกรมออกเวอร์ชันใหม่ ก็ต้องมาแงะงัดกันอีกรอบ

การทำให้ซอฟต์แวร์สามารถทำ localization ได้สะดวก เรียกว่าการทำ internationalization หรือ i18n เป็นการเตรียมความพร้อมให้ซอฟต์แวร์ไม่ “taken for granted” เหมารวมไปว่าสิ่งคุ้นชินทางวัฒนธรรมของโปรแกรมเมอร์นั้น คนอื่นๆ ในโลกจะใช้แบบนั้นไปด้วย

โปรแกรมรุ่นใหม่ๆ ในช่วงสิบปีที่ผ่านมา ออกแบบมาโดยคำนึงถึงเรื่องนี้มากขึ้น ส่วนหนึ่งก็ต้องขอบคุณภาษาโปรแกรม เครื่องมือพัฒนา และระบบปฏิบัติการรุ่นใหม่ๆ ที่ทำให้การเขียนโปรแกรมแบบ i18n สะดวกขึ้น ซึ่งก็ทำให้ทำ L10n ได้ง่ายตามไปด้วย

ในเมืองไทย คนที่ทำเรื่องนี้มานานก็เช่น @theppitak @htk999 @untsamphan @pruet @nanusorn ทำมาตั้งแต่สมัยบุกเบิก ยังไม่มีมาตรฐานสากลเรื่องนี้มากนัก ต้องทำโครงสร้างพื้นฐานขึ้นเองเลย คนเหล่านี้จำนวนมากมีความสัมพันธ์ในทางหนึ่งทางใดกับ NECTEC

อีกรุ่นถัดมาก็เป็น @markpeak @veer66 @kengggg @pittaya ฯลฯ ที่ทำบนฐานของซอฟต์แวร์ที่ออกแบบเรื่อง i18n มาไว้ค่อนข้างดีแล้ว และมาตรฐานอุตสาหกรรมหลายอย่างในเรื่องนี้ก็นิ่งแล้ว

จริงๆ ไม่ต้องพูดถึงเรื่องซอฟต์แวร์อะไรให้ยุ่งยาก เฉพาะการแปลข้อความปกติ ในวิธีคิดแบบ L10n ก็ควรจะแปลแบบปรับเข้าถิ่น ให้สามารถสื่อความความหมายที่ต้องการไปสู่วัฒนธรรมนั้นๆ ได้ ไม่จำเป็นต้องแปลแบบตามอักษร

ภาพนี้เอามาจากเว็บไซต์ไมโครซอฟท์ ที่ชวนคนให้ไปใช้ SkyDrive อย่าใช้ Dropbox เลย

ในราคาเพียง $10/ปี ซึ่งอาจจะถูกกว่าค่าอาหารกลางวันอีกนะ

จะเห็นว่า เป็นการแปลแบบรักษาต้นฉบับไว้ดีมาก แต่มันไม่ลงตัวเท่าไหร่กับถิ่นไทย หน่วยเงินยังเป็นดอลลาร์ และพอแปลงตัวเลขมาเป็นบาทก็ร่วม 300 ซึ่งก็ไม่เมกเซนซ์กับราคาข้าวกลางวันในเมืองไทย (ที่สามร้อยบาทนี่คือค่าแรงขั้นต่ำ :p)

กะจะแค่แคปมาให้ดูเล่นๆ ดันเขียนซะยืดยาว ถือว่าแชร์กันละกัน

เรื่อง “taken for granted” เหมาว่าคนอื่นก็คงคิดเหมือนเรา ทำแบบเรานี่แหละ และเรียกร้องให้ผู้ใช้ปรับตัวให้เข้ากับ “ผลิตภัณฑ์” ที่เราออกแบบ เป็นเรื่องที่เห็นกันทั่วไป ไม่เฉพาะในวงการซอฟต์แวร์

—-
โพสต์ครั้งแรกที่เฟซบุ๊ก Art Bact’

WordPress 2.7 Thai localization update

สัปดาห์ที่ผ่านมา ปรับปรุงคำแปลภาษาไทยบางส่วนของ WordPress 2.7
มีทั้งแก้ตัวสะกด เปลี่ยนคำ และปรับสำนวนแปล โดยเฉพาะในส่วนของ Dashboard

ได้ส่งไปให้ผู้รับผิดชอบการแปลคือคุณ kazama แล้ว ดูรายละเอียดได้ที่เว็บบอร์ด WordThai

(ทำในอัตรางานของ Opendream เพื่อใช้กับเว็บไซต์ครีเอทีฟคอมมอนส์ประเทศไทย http://cc.in.th/)

อัปเดต: คุณ kazama แจ้งว่า WordPress 2.7.1 กำลังจะออกแล้ว ตัวคำแปลที่ผมเสนอไปนี้ อาจจะยังไม่ได้เข้าไปใน 2.7.1 เพราะต้องรอพิจารณาร่วมกันก่อน ว่าจะเอาอันไหนไม่เอาอันไหน

technorati tags:
,
,

Firefox 3.0pre Thai

Following its cousin Thai langpack, Firefox 3.0pre localized build for Thai is out now! Thanks all House 2.0 and Thai L10n people [vdo clip @ duocore.tv].

ผลลัพธ์จากงานเย็นทั่วหล้ามหาสงกรานต์ Firefox Thai L10n sprint @ House 2.0 [ดูคลิป ที่ duocore.tv] มาแล้ว

ไฟร์ฟ็อกซ์ 3.0pre ภาษาไทย (รุ่นทดสอบ) ลองวันนี้ ทั้งบน GNU/Linux, Mac OS X และ Windows XP ดิจิทัลดาวน์โหลด (ทุกค่าย)

งานนี้ pittaya เจ้าหนุ่มพลังบิวด์ ซัดไปหลาย build 😛

ไม่ชอบใจ พบที่ผิด แจ้งที่ หน้าร้องเรียน

updated 2008.04.18: pittaya’s on Firefox 3 Thai Localized Build เล่าแบบละเอียด ๆ

technorati tags:
,
,

more eyeballs are always welcome!

(Thai Firefox L10n sprint)

Add-ons - Language Pack - Thai

เนื่องจากหลุดจากสถานะวุ้นเละ ๆ แล้ว ทีมงานเลยอยากให้ทุกคนช่วยกันดูหน่อย หาที่มันประหลาด ๆ แล้วแจ้งมากันครับ หรือจะมาช่วยกันแปลก็ได้

ดาวน์โหลด language pack ไปลอง (ติดตั้งเหมือนปลั๊กอินทั่วไป):
http://code.google.com/p/thai-l10n/downloads/list

แสดงความคิดเห็น/แจ้งข้อผิดพลาด (เมลกลุ่ม – สมัครก่อนถึงส่งได้):
thai-l10n (at) googlegroups.com

ขอบคุณครับ

“Given enough eyeballs, all bugs are shallow.”

technorati tags:
,
,

early Thai Minefield

(Thai Firefox L10n sprint)

บน Mac OS X* (โดย pittaya)
— build แรกของ sprint นี้ … ซึ่งมีแต่แมค! (มี Ubuntu สองเครื่องเป็นชนกลุ่มน้อย):

Firefox Thai Locale!

บน GNU/Linux (Ubuntu 8.04 Beta):

1st Thai Firefox 3 on GNU/Linux (very pre-release)

บน Windows XP (ลูกเมียน้อยมุมห้อง เพิ่งยกมาในวันที่สอง ด้วยความจำเป็น):

early Thai Minefield on Windows XP

update 2008.04.14: เพิ่มภาพหน้าจอบน Windows XP

technorati tags:
,
,

install Python alternatives

สวัสดีปีใหม่ — 12-14 เม.ย. ผมและเพื่อน ๆ อยู่ที่ Thai Firefox L10n sprint

po2moz ใช้กับ Python 2.5 ไม่ได้ ต้องเป็นรุ่นต่ำกว่านั้น

ลง Python (และโปรแกรมอื่น ๆ) หลาย ๆ รุ่นในเครื่อง และวิธีตั้งค่ารุ่นปริยาย

ลงที่รุ่นที่อยากได้

apt-get install python2.4

บอกเครื่อง ว่าเรามีหลายรุ่นนะ

update-alternatives --install /usr/lib/python python /usr/lib/python2.3 9
update-alternatives --install /usr/lib/python python /usr/lib/python2.4 5
update-alternatives --install /usr/lib/python python /usr/lib/python2.5 1

(–install ลิงก์คำสั่งปริยาย ชื่อคำสั่ง ลิงก์ไปหารุ่นที่ระบุ ลำดับความสำคัญ)

จากนั้นก็เลือกรุ่นที่อยากใช้

update-alternatives --config python

จะเมนูขึ้น เลือก


เอามาจาก Ubuntu Forums อีกแล้ว


*** ในเวลาเดียวกันนี้ ที่ IRC ห้อง #tlwg irc://irc.linux.in.th#tlwg ก็มี OSS glossary sprint ด้วย — จัดการเก็บกวาด คลังศัพท์กลาง Glossary for Open Source Software ไปแจมกันได้

รายละเอียด ข้อมูลเกี่ยวกับการแปล/localization ดูได้ที่ l10n.opentle.org

technorati tags:
,
,