Le changement de langue à la volée dans la swift

Maintenant, je sais qu'apple n'est pas recommandé.

En général, vous ne devez pas changer l'iOS système de la langue (via l'utilisation de la AppleLanguages pref clé) à partir de votre application. Cela va à l'encontre de la base utilisateur iOS modèle pour le changement de langue dans les Paramètres de l'application, et utilise également une préférence clé qui n'est pas documenté, ce qui signifie qu'à un certain moment dans l'avenir, le nom de la clé pourrait changer, ce qui serait briser votre application.

Cependant, c'est une demande que le changement de langue à la volée de sens, fais-moi confiance sur ce point. Je sais aussi que cette question a été posée ici: Le changement de langue à la volée, en cours d'exécution iOS, par programmation. Toutefois, cela se fait vieux et je me demandais si il y a une nouvelle, meilleure, ou des façons plus faciles de le faire. Actuellement, dans mon application, j'ai une langue de choix de l'écran. En cliquant sur des boutons de ce point de vue appelle la fonction suivante avec la langue, le bouton est associé à:

 func changeLang(language: String) {

    if language != (currentLang as! String?)! {
        func handleCancel(alertView: UIAlertAction!)
        {

        }
        var alert = UIAlertController(title: NSLocalizedString("language", comment: "Language"), message: NSLocalizedString("languageWarning", comment: "Warn User of Language Change Different Than Defaults"), preferredStyle: UIAlertControllerStyle.Alert)

        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler:handleCancel))
        alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction) in

            NSUserDefaults.standardUserDefaults().setObject([language], forKey: "AppleLanguages")
            NSUserDefaults.standardUserDefaults().synchronize()
            println(self.currentLang)

            let alert = UIAlertView()
            alert.title = NSLocalizedString("language", comment: "Sign In Failed")
            alert.message = NSLocalizedString("languageChangeNotification", comment: "Notify of language change")
            alert.addButtonWithTitle(NSLocalizedString("ok", comment: "Okay"))
            alert.show()

            self.performSegueWithIdentifier("welcome", sender: AnyObject?())


        }))
        self.presentViewController(alert, animated: true, completion: {
        })
    } else {
        self.performSegueWithIdentifier("welcome", sender: AnyObject?())
    }

}

Exemple:

@IBAction func english(sender: UIButton) {
        changeLang("en")

    }

Si l'utilisateur sélectionne une langue autre que la leur, ils reçoivent une alerte de confirmation, puis demande de redémarrer il y a de l'appareil. C'est ce que je veux changer. Il semble que cette section de NSUSerDefaults n'est pas synchronisé jusqu'à ce que l'application redémarre. La preuve:

let currentLang: AnyObject? = NSLocale.preferredLanguages()[0]
println(currentLang)
//Prints english
changeLang("zh-Hans")
println(currentLang)
// Prints english still until restart 

L'actuel système d'internationalisation apple a est grand, et j'ai l'intention de l'utiliser. Cependant, comment puis-je changer la langue à la volée, peut-être que de forcer une mise à jour sur le NSUSerDefaults?

Edit: je recommande d'utiliser ce bibliothèque pour le faire maintenant. Bonne chance!

OriginalL'auteur modesitt | 2015-08-05