獲取系統語言/當前 App支援語言

黑羽肅霜_發表於2019-02-27

簡述

開發中設計多語言內容的部分總是很讓人頭疼。
本文也是在摸索中找到了幾種可以獲取當前系統語言的方法。

注意區分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 設定的支援切換的語言陣列

;

說明

  • 由此可以看到這幾個獲取系統語言的方法準確性(或者說顆粒度)是不一樣的,前兩種userLanguageappLanguages 獲取的會將國家地區的程式碼加上,而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
    }
}
複製程式碼

相關文章