Localization - 如何在 App 內切換不同語言

更新於 發佈於 閱讀時間約 9 分鐘
實際切換效果

實際切換效果

建立 LocalizationManager

首先創建一個 Manager 控管內部切換語言,這邊我命名為 LocalizationManager ,他是一個 Singleton ,跟著 App 一起存亡

上一篇有提到,每新增一個語言就會多一個語言資料夾,因此當使用者切換語言的時候,要將讀取的資料夾路徑做變換,讓 Manager 去讀取切換的語言資料夾,達到切換語言的功能

資料夾結尾都是.lproj

資料夾結尾都是.lproj

最終想要達成從外部呼叫 LocalizationManager.shared.language = .english 簡單明瞭的方式切換語言,開始寫程式吧!

建立 enum

建立 enum Language ,把所有會切換的語言列入

enum Language: String {
case english = "en"
case chineseT = "zh-Hant"
case chineseS = "zh-Hans"
case system

var segmentNum: Int {
switch self {
case .english:
return 0
case .chineseT:
return 1
case .chineseS:
return 2
case .system:
return 3
}
}
}

建立變數

// 當系統語言開頭為 "ZH" 之外的語言都給英語的路徑
var languageForBundle: Language = {
if let systemLanguage = Locale.preferredLanguages.first {
if systemLanguage.hasPrefix("zh") {
if systemLanguage.contains("Hant") || systemLanguage.contains("Trad") {
return .chineseT
}
return .chineseS
}
}
return .english
}()

// 當 language 有變動時儲存至 UserDefaults ,當有已存的語言就讀取,沒有則判定為系統語言
var language: Language = {
// read saved language
let languageString = UserDefaults.standard.string(forKey: UDKey.language.rawValue)
if let language = Language(rawValue: languageString ?? "") {
return language
}
// no saved so read system
return .system
}(){
didSet {
UserDefaults.standard.setValue(language.rawValue, forKey: UDKey.language.rawValue)
}
}

在 manager 內建立兩個變數,languageForBundle 讀取本機系統目前的語言,language 則是讀取使用者在 App 內部選取的語言,如果使用者沒有選擇語言則跟隨本機系統目前的語言

外部如何呼叫並實現功能

建立一個 function (給予 Key 會去抓目標語言的檔案內對應的 value)

func strWithKey(key: String) -> String? {
var resource: String

// 透過 language 獲得的值去取得語言名稱 ex: zh-Hant
if self.language == .system {
resource = self.languageForBundle.rawValue
} else {
resource = self.language.rawValue
}

// 獲得路徑
guard let path = Bundle.main.path(forResource: resource, ofType: "lproj"),
let bundle = Bundle(path: path) else { return nil }

let str = bundle.localizedString(forKey: key, value: "", table: nil)
return str
}

ViewController 呼叫

// ViewController
// 用​ SegmentedControl 切換語言
@IBAction func changeLanguage(_ sender: UISegmentedControl) {

switch sender.selectedSegmentIndex {
// en, ch-tra, ch-sim, system
case 0:
LocalizationManager.shared.language = .english
case 1:
LocalizationManager.shared.language = .chineseT
case 2:
LocalizationManager.shared.language = .chineseS
case 3:
LocalizationManager.shared.language = .system
default:
break
}

reloadText()
}

private func reloadText() {
greetingLabel.text = (LocalizationManager.shared.strWithKey(key: LocalizedKey.label_greeting.str) ?? "") + (name ?? "")
buyDiamondsLabel.text = LocalizationManager.shared.strWithKey(key: LocalizedKey.label_buyDiamond.str)
changeLanLabel.text = LocalizationManager.shared.strWithKey(key: LocalizedKey.label_language.str)

restoreBtn.setTitle(LocalizationManager.shared.strWithKey(key: LocalizedKey.btn_restore.str), for: .normal)
hasLogedInBtnState(LogInDataManager.shared.hasAccountNPasswd())

lanSegment.setTitle(LocalizationManager.shared.strWithKey(key: LocalizedKey.label_system.str), forSegmentAt: 3)

tableView.reloadData()
}
ViewController 內切換後,如果你不會重新經過生命週期的話,記得要建立一個 reload 的功能,讓文字刷新

附上完整的 LocalizationManager

大功告成拉!!!感謝大家看到這邊,希望多少有幫助到想實作這個功能的捧友~

最近發現,有時候不是功能多難花很多時間,而是想要的流程或程式更乾淨簡潔思考很久,完成後很有成就感,覺得自己又更聰明了(遠目

留言
avatar-img
留言分享你的想法!
avatar-img
是我太奇怪還是世界很無奈的沙龍
7會員
4內容數
2023/10/08
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
Thumbnail
2023/10/08
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
Thumbnail
2022/03/06
咻咻回家發現行車紀錄器壞了,噴了三千大洋換mio小姐,以後就麻煩她報測速了,還被車廠維修先生假撩妹真詐財,幸好我識破了他的伎倆😎 晚上跟卓寶去看咒術迴戰,好好看!!!純愛好感動,最喜歡狗卷,喜歡到不行,鮭魚❤️ 可能是阿月要來了
Thumbnail
2022/03/06
咻咻回家發現行車紀錄器壞了,噴了三千大洋換mio小姐,以後就麻煩她報測速了,還被車廠維修先生假撩妹真詐財,幸好我識破了他的伎倆😎 晚上跟卓寶去看咒術迴戰,好好看!!!純愛好感動,最喜歡狗卷,喜歡到不行,鮭魚❤️ 可能是阿月要來了
Thumbnail
2022/02/20
其實這兩週都沒什麼約會,唯一大的起伏是詩梵真的要飛往英國了,一直覺得很遙遠的事突然在眼前,好不真實的感覺
Thumbnail
2022/02/20
其實這兩週都沒什麼約會,唯一大的起伏是詩梵真的要飛往英國了,一直覺得很遙遠的事突然在眼前,好不真實的感覺
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
Anytype設定與查看小技巧 : 如何設定中文界面、如何再次查看助記詞、如何在手機上登錄Anytype
Thumbnail
Anytype設定與查看小技巧 : 如何設定中文界面、如何再次查看助記詞、如何在手機上登錄Anytype
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
Apps Script 的 Google Translate Service 可以幫你自動翻譯文本,是個還不錯的翻譯方案。來一起看看我的觀點!
Thumbnail
Apps Script 的 Google Translate Service 可以幫你自動翻譯文本,是個還不錯的翻譯方案。來一起看看我的觀點!
Thumbnail
如何實現在 App 內部就可直接切換語言,無需手機系統都要跟著切換語言的方法。
Thumbnail
如何實現在 App 內部就可直接切換語言,無需手機系統都要跟著切換語言的方法。
Thumbnail
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
Thumbnail
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News