iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Mobile Development

ios 的小小實驗室 2 !!系列 第 13

Localization 4 多國語系 - 在 App 內切換語系

  • 分享至 

  • xImage
  •  

今天會介紹「手動切換來調整 App 所要顯示的語系」

作法與前幾天介紹的大致相同,只不過需要手動將圖片檔搬移至各語系指定的資料夾下。
以下實作以兩種不同的圖片,分別代表英文和繁體中文

  1. 首先設定好起始畫面

    • 拉兩個 UIButton 分別顯示 英文語系繁體中文語系 的畫面
    • @IBAction 的部分,分別執行跳頁的動作
  2. 新增 English 畫面

    • UILabel 顯示目前畫面的語系
    • UIImageView 作為顯示該語系的圖示
  3. 新增 繁體中文 畫面

    • UILabel、UIImageView 使用方式與 English 畫面 相同
  4. 將圖片拉入專案底下

    • 分別將代表各個語系的圖片加入專案底下
    • 點選 English.png → show the file inspector → 點擊 Localize → 點選 English
    • 點選 Chinese.png → show the file inspector → 點擊 Localize → 點選 Chinese, Traditional(zh-Hant)
  5. 寫個方便呼叫的函數

    import UIKit
    
    class Localize: NSObject {
    
    	static let shared = Localize()
    
    	/// 依語系檔裡的 key 取得 value 值(用於 Label 的 Text)
    	///
    	/// - Parameters:
    	///   - withText: 多國語系檔的 key 值
    	///   - withLocalizationFileNmae: 多國語系檔的檔名
    	/// - Returns: String
    	func localizedText(withText key: String, withLocalizationFileNmae localizationFileNmae: String) -> String {
    
    		// 取得 Bundle 下的的多國語系檔
    		let path = Bundle.main.path(forResource: localizationFileNmae, ofType: "lproj")
    		let bundle = Bundle(path: path!)
    
    		// 依 key 值和 Bundle 的多國語系檔取得對應的 value
    		return NSLocalizedString(key, tableName: nil, bundle: bundle!, value: "", comment: "")
    	}
    
    	/// 依語系檔裡的 key 取得 value 值(用於 UIImageView)
    	///
    	/// - Parameters:
    	///   - withImageName: 多國語系檔的 key 值
    	///   - withLocalizationFileNmae: 多國語系檔的檔名
    	/// - Returns: UIImage
    	func localizedImage(withImageName key: String, withLocalizationFileNmae localizationFileNmae: String) -> UIImage {
    
    		// 取得 Bundle 下的的多國語系檔
    		let path = Bundle.main.path(forResource: localizationFileNmae, ofType: "lproj")
    		let bundle = Bundle(path: path!)
    
    		// 依 key 值和 Bundle 的多國語系檔取得對應的 value
    		return UIImage(named: NSLocalizedString(key,bundle: bundle!, comment: ""))!
    	}
    }
    
  6. 在 Localizable.strings 裡寫好對應的多國

    English:

    繁體中文:

  7. 分別在各個語系的畫面裡,將 Label 、 Image View 呼叫其對應的文字與圖片

    分別在 EnglishViewController、ChineseViewController 裡

    • UILabel:
      ocalize.shared.localizedText(withText:「填入 Localizable.strings 裡的 Key」, withLocalizationFileNmae: 「填入 多國語系的資料夾檔名」)
      ``
      
    • UIImageView:
      ocalize.shared.localizedImage(withImageName:「填入 多國語系.lproj 裡的 圖片名稱」, withLocalizationFileNmae: 「填入 多國語系的資料夾檔名」)
      ``
      
      
      

大功告成!


各個畫面的完整程式碼:

  • MainViewController:
    mport UIKit
    
    lass MainViewController: UIViewController {
    
    @IBOutlet weak var baseLabel: UILabel!
    @IBOutlet weak var iconEnglishButton: UIButton!
    @IBOutlet weak var iconChineseButton: UIButton!
    
    override func viewDidLoad() {
    	super.viewDidLoad()
    	iconEnglishButton.setTitle("English", for: .normal)
    	iconChineseButton.setTitle("Chinese", for: .normal)
    
    }
    
    @IBAction func pushToLanguagePage(_ sender: UIButton) {
    	switch sender{
    	case iconEnglishButton:
    		let nextVC = EnglishViewController()
    		self.navigationController?.pushViewController(nextVC, animated: false)
    	case iconChineseButton:
    		let nextVC = ChineseViewController()
    		self.navigationController?.pushViewController(nextVC, animated: false)
    	default:
    		break
    	}
    }
    
    ``
    
  • EnglishViewController:
    mport UIKit
    
    lass EnglishViewController: UIViewController {
    
    @IBOutlet weak var englishLabel: UILabel!
    @IBOutlet weak var iconEnglishImageView: UIImageView!
    
    override func viewDidLoad() {
    	super.viewDidLoad()
    	englishLabel.text = Localize.shared.localizedText(withText: "language", withLocalizationFileNmae: "en")
    	iconEnglishImageView.image = Localize.shared.localizedImage(withImageName: "English", withLocalizationFileNmae: "en")
    }
    
    ``
    
    
  • ChineseViewController:
    mport UIKit
    
    lass ChineseViewController: UIViewController {
    
    @IBOutlet weak var chineseLabel: UILabel!
    @IBOutlet weak var iconChineseImageView: UIImageView!
    
    override func viewDidLoad() {
    	super.viewDidLoad()
    	chineseLabel.text = Localize.shared.localizedText(withText: "language", withLocalizationFileNmae: "zh-Hant")
    	iconChineseImageView.image = Localize.shared.localizedImage(withImageName: "Chinese", withLocalizationFileNmae: "zh-Hant")
    }
    
    ``
    
    

GitHub - LocalizationAppInsideChangeDemo


上一篇
Localization 3 多國語系 - 圖片
下一篇
Local Authentication 1 生物辨識的介紹
系列文
ios 的小小實驗室 2 !!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言