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
是我太奇怪還是世界很無奈的沙龍
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
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
Apps Script 的 Google Translate Service 可以幫你自動翻譯文本,是個還不錯的翻譯方案。來一起看看我的觀點!
Thumbnail
Apps Script 的 Google Translate Service 可以幫你自動翻譯文本,是個還不錯的翻譯方案。來一起看看我的觀點!
Thumbnail
為什麼寫這麼基本的設定呢? 剛開始打字時預設內定為微軟注音,因為沒有全部設定好,導致後續寫稿時常常打錯字,也有是因為打注音時選錯字也有關。 雖然這個很基本,但也有滿多人不知道該怎麼設定,或常被微軟裡其設定繁雜而困擾,至少我找了一陣子......。 進入畫面右下方切換中英文(右鍵),叫出IME工
Thumbnail
為什麼寫這麼基本的設定呢? 剛開始打字時預設內定為微軟注音,因為沒有全部設定好,導致後續寫稿時常常打錯字,也有是因為打注音時選錯字也有關。 雖然這個很基本,但也有滿多人不知道該怎麼設定,或常被微軟裡其設定繁雜而困擾,至少我找了一陣子......。 進入畫面右下方切換中英文(右鍵),叫出IME工
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
Thumbnail
身為一個菜鳥工程師,將辛苦製作的 App 推向國際,多國語言是肯定要的。 那要如何在 App 中設定變成可以支援多語系的專案呢? Localization 多國語系設定,讓我們繼續看下去...
Thumbnail
Anytype設定與查看小技巧 : 如何設定中文界面、如何再次查看助記詞、如何在手機上登錄Anytype
Thumbnail
Anytype設定與查看小技巧 : 如何設定中文界面、如何再次查看助記詞、如何在手機上登錄Anytype
Thumbnail
如何實現在 App 內部就可直接切換語言,無需手機系統都要跟著切換語言的方法。
Thumbnail
如何實現在 App 內部就可直接切換語言,無需手機系統都要跟著切換語言的方法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News