簡述
開發中設計多語言內容的部分總是很讓人頭疼。
本文也是在摸索中找到了幾種可以獲取當前系統語言的方法。
注意區分app 內的當前語言,和系統的當前語言
Swift
let userLanguage = UserDefaults.standard.object(forKey: "AppleLanguages") //返回的也是陣列
let appLanguages = Locale.preferredLanguages // 返回一個陣列
let deviceLanguage = Locale.current.languageCode
let bundleLanguages = Bundle.main.preferredLocalizations // 返回一個陣列
let availableLanguages = Localize.availableLanguages() // 必須引入第三方庫 import Localize_Swift, 獲取當前 app 所有支援的語言列表
let currentLanguage = Localize.currentLanguage() // 引入第三方庫,表示當前 App 使用的語言
複製程式碼
Objective C
NSString *userLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]
NSString *appLanguages = [NSLocale preferredLanguages];
NSString *deviceLanguage = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
NSString *bundleLanguages = [[NSBundle mainBundle] preferredLocalizations]
複製程式碼
表格說明
userLanguage | appLanguages | deviceLanguage | bundleLanguages | availableLanguages | |
---|---|---|---|---|---|
返回型別 | [“zh-Hans-CN”, “en”] | [“zh-Hans-CN”, “en”] | “zh” | [“zh-Hans”] | [“zh-Hans”,”zh-Hant”,”en”] |
說明 | 從 userDefault 中獲取到的,返回的是一個陣列. 表示在當前 app 下使用過的 | 使用者在手機系統設定裡設定的語言。可以通過設定 -> 一般 -> 語言與地區 看到,不是程式正在顯示的語言。 |
似乎是當前使用語言的大類。不帶地區碼 | 帶語言的二級分類,但不帶地區碼 | (第三方庫支援) 當前 App 設定的支援切換的語言陣列 |
;
說明
- 由此可以看到這幾個獲取系統語言的方法準確性(或者說顆粒度)是不一樣的,前兩種
userLanguage
和appLanguages
獲取的會將國家地區的程式碼加上,而deviceLanguage
只是顯示是中文(大類),並不能區分是繁體中文還是簡體中文,而最後這個方法帶二級分類的語言型別 - 表示使用者在當前 app 下使用過的語言。因此返回的是一個陣列。這個值返回的會帶上
zh-Hans-CN
地區和分類zh-Hant-HK
- 我查閱了一些資料,然而並未找到具體的這幾個分類的文件說明。後續有找到的話再繼續補充吧。
設定當前預設的語言
import Localize_Swift
let bundleLanguage = Bundle.main.preferredLocalizations[0]
let availableLanguages = Localize.availableLanguages()
var language = "en" // 如果找不到當前匹配的語言,預設使用英語
for availableLanguage in availableLanguages {
if let _ = availableLanguage.range(of: bundleLanguage) {
language = appLanguage
break
}
}
複製程式碼