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

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

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

留言0
查看全部
avatar-img
發表第一個留言支持創作者!
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
咻咻回家發現行車紀錄器壞了,噴了三千大洋換mio小姐,以後就麻煩她報測速了,還被車廠維修先生假撩妹真詐財,幸好我識破了他的伎倆😎 晚上跟卓寶去看咒術迴戰,好好看!!!純愛好感動,最喜歡狗卷,喜歡到不行,鮭魚❤️ 可能是阿月要來了
其實這兩週都沒什麼約會,唯一大的起伏是詩梵真的要飛往英國了,一直覺得很遙遠的事突然在眼前,好不真實的感覺
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
咻咻回家發現行車紀錄器壞了,噴了三千大洋換mio小姐,以後就麻煩她報測速了,還被車廠維修先生假撩妹真詐財,幸好我識破了他的伎倆😎 晚上跟卓寶去看咒術迴戰,好好看!!!純愛好感動,最喜歡狗卷,喜歡到不行,鮭魚❤️ 可能是阿月要來了
其實這兩週都沒什麼約會,唯一大的起伏是詩梵真的要飛往英國了,一直覺得很遙遠的事突然在眼前,好不真實的感覺
你可能也想看
Google News 追蹤
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
Anytype設定與查看小技巧 : 如何設定中文界面、如何再次查看助記詞、如何在手機上登錄Anytype
Thumbnail
這是我第一次接觸到中國簡體書轉繁體書的校對工作,真佩服編輯可以細膩查對台灣用語,抓出台灣與中國用字用語的差異,考驗編輯的功力,也考驗台灣讀者對日常用語的底線,先不談統戰,影片不是視頻,至少書名有守住,其他的部分,真的是如履薄冰,不是普及度的底線,而是常用語被置換的底線,真的想聽聽簡轉繁書籍出版主編的
Thumbnail
從中英文之間的語言轉換與文化差異探討,深入探索中英文之間的聯係和轉換方式。
華人在學習英文為第一外語時,最常碰到的學習問題就是「一字多義」。例如:截圖中Yahoo中英字典中詳述agent有六種截然不同的中文意思。   當你是準備TOEIC(多益)考試時,只要懂第一種用法「代理人;代理商;仲介人」即可。並且在刷TOEIC(多益)Official Guide(官方正式考
Thumbnail
單語者是使用或通曉一種語言的人,通常為母語;多語者是使用或通曉多國語言的人,除了母語,還包括其他外語。
Thumbnail
台灣市場規模不夠的先天不足,加上網際網路有打破地理限制的特性,在我從事系統開發以來,出資人或是產品經理在發展數位產品時,常會希望系統能夠觸及全世界各地的使用者。衍生的就是系統需要能夠全球化、在地化的需求。然而這不僅僅是一個關於語言轉換的問題,而是一個涉及技術、法律以及市場策略等多維度的問題。
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
講述兩件事情: 情緒詞很特別!在 mental lexicon (心理詞典) 中是可以被單獨分出來的一類。 情緒概念因不同語言 (文化) 而異,且雙語者認知的情緒概念可能也與單語者不同。
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
Anytype設定與查看小技巧 : 如何設定中文界面、如何再次查看助記詞、如何在手機上登錄Anytype
Thumbnail
這是我第一次接觸到中國簡體書轉繁體書的校對工作,真佩服編輯可以細膩查對台灣用語,抓出台灣與中國用字用語的差異,考驗編輯的功力,也考驗台灣讀者對日常用語的底線,先不談統戰,影片不是視頻,至少書名有守住,其他的部分,真的是如履薄冰,不是普及度的底線,而是常用語被置換的底線,真的想聽聽簡轉繁書籍出版主編的
Thumbnail
從中英文之間的語言轉換與文化差異探討,深入探索中英文之間的聯係和轉換方式。
華人在學習英文為第一外語時,最常碰到的學習問題就是「一字多義」。例如:截圖中Yahoo中英字典中詳述agent有六種截然不同的中文意思。   當你是準備TOEIC(多益)考試時,只要懂第一種用法「代理人;代理商;仲介人」即可。並且在刷TOEIC(多益)Official Guide(官方正式考
Thumbnail
單語者是使用或通曉一種語言的人,通常為母語;多語者是使用或通曉多國語言的人,除了母語,還包括其他外語。
Thumbnail
台灣市場規模不夠的先天不足,加上網際網路有打破地理限制的特性,在我從事系統開發以來,出資人或是產品經理在發展數位產品時,常會希望系統能夠觸及全世界各地的使用者。衍生的就是系統需要能夠全球化、在地化的需求。然而這不僅僅是一個關於語言轉換的問題,而是一個涉及技術、法律以及市場策略等多維度的問題。
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
講述兩件事情: 情緒詞很特別!在 mental lexicon (心理詞典) 中是可以被單獨分出來的一類。 情緒概念因不同語言 (文化) 而異,且雙語者認知的情緒概念可能也與單語者不同。