2017-03-08 5 views
1

私はこれについて多くの回答を読んだことがありますが、ほとんどのものは長年のものであり、最新の情報はわかりません。ユーザーの選択に基づいてアプリケーションのローカライズを変更してください

最初の起動時に、私のアプリはOSのデフォルト言語を使用するのではなく、ユーザーが使用する言語をユーザーに尋ねます。

  1. アプリのローカリゼーションの残りの部分を選択した言語に設定するにはどうすればよいですか?
  2. 他のビューでユーザーが選択した言語を取得するにはどうすればよいですか?

私は、次のコードは、言語を設定しますが、それは仕事をしていなかったと思った:デフォルトでは

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

このアプローチについて2回考えてみると、いくつかのリスクがあります。たとえば、アプリ内にマップビューを表示しようとすると、言語が現在の設定と一致しない可能性があります。 – Andrea

+0

@アンドレアそれでは、より良いアプローチは何ですか? –

答えて

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 
} 
関連する問題