我用一個LanguageManager
單處理類來處理這個問題,它處理所有的本地化。這是一些僞代碼,因爲它通常是一個相當大的類。
它有支持,例如所有語言環境的列表:
let supportedLocales = ['en-US', 'en-CA', 'fr', 'es-ES', 'es-MX']
它還存儲在UserDefaults
所選語言。當selectedLocale變化,它發出了一個通知,如果你想通知你的意見或其他任何東西:現在
var selectedLocale: String? {
get {
return UserDefaults.standard.object(forKey: UserDefaultsKeys.selectedLocale) as? String
}
set (newLocale) {
let didChange = self.selectedLocale != newLocale
UserDefaults.standard.set(newLocale, forKey: UserDefaultsKeys.selectedLocale)
UserDefaults.standard.synchronize()
if didChange {
NotificationCenter.default.post(name: Notification.Name.localeDidChange, object: nil)
}
}
}
,爲了牽線你的localized.strings的文件,你不能使用標準的蘋果方法 - 你必須提供你自己的方法。使用LanguageManager.shared.getString(for key:String, alt:String)
來引用您的.strings
文件中的密鑰以提取本地化字符串。
var selectedLanguage:String? {
//returns just the language portion of the locale - eg: 'en' from 'en-US'
if let selectedLocale = selectedLocale {
return selectedLocale.components(separatedBy: "-")[0]
}
return nil
}
func getString(for key:String, alt:String) -> String
{
var val:String? = getString(for:key, language: selectedLocale)
if val == nil {
val = getString(for:key, language: selectedLanguage)
}
if val == nil {
val = getString(for:key, language: "en") //default to English
}
if let val = val {
return val
}
return alternate //use fallback
}
func getString(for key:String, language:String) -> String?
{
let path = Bundle.main.path(forResource:language, ofType:"lproj")
if let languageBundle = Bundle(path:path) {
return languageBundle.localizedString(for: key)
}
return nil
}
三思此方法存在一定的風險。例如,如果您要在應用程序內顯示地圖視圖,則該語言無法與當前設置匹配。 – Andrea
@Andrea那麼更好的方法是什麼? –