2017-03-08 56 views
1

我已閱讀了很多有關此問題的答案,但大多數都有很多年了,我不知道最新信息是什麼。根據用戶選擇更改應用程序本地化

第一次啓動時,我的應用程序會詢問用戶他喜歡哪種語言,而不是僅僅使用操作系統默認語言。

  1. 如何將應用程序的本地化其餘部分設置爲所選語言?
  2. 如何獲得用戶在其他視圖中選擇的語言?

我想下面的代碼將設置語言,但它並沒有做的工作:

UserDefaults.standard.set("AR", forKey: "AppleLanguages") 
UserDefaults.standard.synchronize() 
+0

三思此方法存在一定的風險。例如,如果您要在應用程序內顯示地圖視圖,則該語言無法與當前設置匹配。 – Andrea

+0

@Andrea那麼更好的方法是什麼? –

回答

0

默認是英文語言//你可以根據你

UserDefaults.standard.set("en", forKey: "Apple") 
    UserDefaults.standard.synchronize() 
設置語言

如果你想比使用代碼當前系統的語言

let langStr = Locale.current.languageCode //and set in UserDeafaults 
UserDefaults.standard.set(langStr, forKey: "Apple") 

var currentlanguage: String? 
self.currentlanguage = UserDefaults.standard.object(forKey: "Apple") as! String? 
print("current language ---%@",self.currentlanguage) 
+0

儘管我已經爲其他語言環境設置了字符串,並且通過更改方案中的語言進行了測試,但它並未在UI上進行任何更改。 –

2

我用一個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 
} 
相關問題