สวัสดีครับ พอดีได้รับโปรเจคแอป ios ทำแอปแบบสองภาษา คือ ไทย-อังกฤษ จริงๆก่อนหน้านี้ก็เคยทำมาแล้ว แต่ยังไม่ได้เขียนบทความ จนเว้นช่วงมานานพอได้กลับมาทำอีกทีก็จำไม่ได้แล้ว จึงถือโอกาสทำเป็นบทความเผื่อไว้กลับมาทบทวนด้วยครับ
1 2 3 4 5 6 7 |
if UserDefaults.standard.string(forKey: "language") == "en" { setLanguage("en") }else{ setLanguage("th") } |
การทำแอปรองรับหลายภาษา ถ้าทำโดยปกติแบบรวดเร็วทั่วๆไป เชื่อว่าหลายๆท่านคงจะใช้กระบวนท่า UserDefault บันทึกค่า language เป็น en,th จากนั้นเช็กเงื่อนไข if และปรับภาษาของ UI ตามนั้น ตามตัวอย่างโค้ดด้านบน
คราวนี้เรามาดูอีกวิธีที่จะแนะนำเผื่อเป็นทางเลือกนะครับ บางท่านอาจจะยังไม่รู้ว่า มีวิธีการตั้งค่าแบบนี้อยู่ด้วย ซึ่งเป็นการสร้างไฟล์ strings เพื่อใช้เก็บค่าตัวแปรและภาษาของแต่ล่ะภาษาไว้ในไฟล์ เพื่อสะดวกในการปรับแก้ไขได้ในภายหลังครับ ดังตัวอย่างในรูปข้างล่าง…

การเรียนรู้ที่ดีที่สุด คือการลงมือทำ…
เรามาเริ่มต้นลงมือทำกันเลยดีกว่าครับ เริ่มต้นด้วยการ create new project ใน xcode ก่อนเลยครับ ของผมใช้ว่า TestApp นะครับ ตั้งกันตามสะดวกได้เลย จากนั้นคลิกที่โปรเจค TestApp ตามในรูป ดูที่หัวข้อ Localizations จะเห็น Language คือภาษาที่รองรับ ให้กด + บวกได้เลย(ไม่ได้ไปรุมใครนะครับ 555+) เพิ่มเป็นภาษาไทยครับ เพราะมี default เป็น english มาให้อยู่แล้ว

หลังจากกดเลือกภาษาที่เราต้องการแล้ว จะมีให้เลือก storyboard ที่เราจะใช้ทำแบบรองรับหลายภาษา เราก็เลือกติ๊กทั้งหมดเลยครับ ตามภาพด้านล่างนี้

หลังจากเพิ่มภาษาเข้ามาแล้ว ให้คลิกขวาเลือก New Files… เลือก Strings File เพื่อสร้างไฟล์ localizable.strings เพื่อไว้ตั้งค่าภาษาสำหรับส่วนของการเขียนโค้ดมาอ่านค่า ตามภาพด้านล่างนี้

ให้ทำการเพิ่ม 2 ภาษา คลิกเข้าไปที่ไฟล์ Localizable.strings ในช่องทางขวามือ ให้ติ๊กภาษาทั้ง thai,english ในหัวข้อ Localization เพื่อไว้ตั้งภาษา ตามภาพด้านล่างนี้

จัดการตั้งค่าภาษาได้ตามความต้องการเลยครับ

สุดท้ายคือการเขียนโค้ดเรียกใช้งานครับ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import UIKit class ViewController: UIViewController { @IBAction func clickThai(_ sender: Any) { titleLabel.text = "Home".localized(lang: "th") } @IBAction func clickEnglish(_ sender: Any) { titleLabel.text = "Home".localized(lang: "en") } @IBOutlet var titleLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } } extension String { func localized(lang: String)->String{ let path = Bundle.main.path(forResource: lang, ofType: "lproj") let bundle = Bundle(path: path!) return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "") } } |
ขออธิบายตัวโค้ดซักนิดนึง ส่วนข้างล่างคือ ส่วนสำคัญของโค้ดอยู่ที่ extension String ก็คือสร้างฟังก์ชันเพิ่มใหม่ให้กับ String โดยจะส่งค่า parameter เป็น lang หรือภาษาที่เราเลือก จากนั้นส่งค่าเพื่อดึงข้อมูลจาก NSLocalizedString จะได้ค่า String ที่เป็นอักษรภาษากลับมาครับ จากนั้นที่เหลือก็แค่แปลง UI ให้ใช้ภาษาที่ได้รับกลับไปครับ
ยังไงชอบวิธีไหนก็เลือกใช้งานกันตามสมควรได้เลยนะครับ ผลการรันทดสอบตามด้านล่างได้เลยครับ 🙂
https://github.com/nisit15/SwiftMultiLanguage

2