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
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous devez vous enseigner bundle comment changer de langue par le chargement de différents groupes de fichiers.
J'ai traduit mon Code Objective-C Swift — au sortir de la NSBundle catégorie intacte.
Le résultat est une vue de contrôleur de classe qui offre un
languageDidChange()
méthode de remplacement.NSBundle+Langue.h
NSBundle+Langue.m
AppDelegate.swift
BaseViewController.swift
ViewController.swift
au lieu d'utiliser des sous-classes de BaseViewController, votre viewcontrollers pourrait aussi poster "LANGUAGE_WILL_CHANGE" écouter "LANGUAGE_DID_CHANGE"
J'ai poussé le projet complet ici: ImmediateLanguageSwitchSwift
super.languageDidChange()
supposé être une fonction vide? J'ai essayé de mettre en œuvre votre code mais il ne fonctionne pas pour moi :/oui, comme vous avez à mettre en œuvre ce qu'un changement de langage signifie aigre vc.
Désolé, de ne pas l'obtenir. Pourrait expliquer que, comme pour le total retarde?
C'est une méthode qui est appelée lors du changement de la langue, de sorte que vous pouvez réagir sur ce point. L'implémentation par défaut est vide, comme la base de cv n'a rien à faire.
Yay, réussi à le faire fonctionner. Merci! Btw. est-ce sous licence MIT? Serait heureux de l'utiliser 🙂
OriginalL'auteur vikingosegundo
pour moi, "Swift Localiser" bibliothèque résolu le problème de la sur-the-fly de changement de langue.
a fonctionné pour moi, mais je ne suis pas sûr de savoir comment faire INTERFACE utilisateur existante changer une fois que la langue est modifiée. Si je l'ai trouver vais poster ici.
Il est bon mais il ne fonctionne pas pour tous les cas, par exemple de la troisième partie du cadre qui utilisent par défaut NSLocalizedString.
Avez-vous été en mesure de comprendre comment modifier l'interface utilisateur existante une fois que la langue est changée? Je suis confronté à un problème similaire.
ouais, je suis d'accord
OriginalL'auteur AbdulMomen عبدالمؤمن
Comme répondu par "vikingosegundo" ci-dessus, c'était d'avoir de la catégorie dans
Objective c
Voici donc
Swift extension
versionreste du code sera de même, comme mentionné par "vikingosegundo"
Corrections sont toujours les bienvenus 🙂
Toujours Les Bienvenus 🙂
OriginalL'auteur singh.jitendra
Utiliser cette ligne de code, il va changer de mise en page, sans fermer l'application.
De droite à gauche
Et de Gauche à Droite Flip
et si vous voulez changer de champ de texte mise en page ou le changement de texte, puis utiliser ce code, car j'ai été confronté à ce problème . textfield des textes n'a pas été changning de mise en page. vérifier ce code pour modifier la disposition des champs de texte.
OriginalL'auteur Shahzaib Maqbool