web-dev-qa-db-fra.com

Swift: Comment changer la langue dans l'application?

j'utilise la bibliothèque Localize-Swift ( Link ) pour localiser mon application et cela fonctionne très bien avec les fichiers .strings. le problème est que je dois localiser dans une langue qui est de droite à gauche et que je dois localiser via Interface Builder Storyboard afin que je puisse faire en sorte que les contrôleurs de vue aient l'air correct au format RTL. La question est de savoir comment définir le storyboard sur la langue sélectionnée par l'utilisateur en temps réel.

par exemple, j'ai 2 fichiers de storyboard:

1- ... /ProjectName/Base.lproj/Main.storyboard

2- ... /ProjectName/fa-IR.lproj/Main.storyboard

comment puis-je basculer entre eux en temps réel?

je sais déjà que je peux le changer dans les schémas et la langue de l'appareil, mais je veux le faire en temps réel et je ne veux pas que les utilisateurs redémarrent leur appareil.

merci

5
KababChi

trouvé ma réponse:

NSUserDefaults.standardUserDefaults().setObject(["language identifier"], forKey: "AppleLanguages") 
NSUserDefaults.standardUserDefaults().synchronize()

malheureusement, l'utilisateur doit redémarrer l'application! si quelqu'un pouvait trouver une solution pour ne pas redémarrer l'application, veuillez m'en informer.

7
KababChi

Vous pouvez utiliser NSBundle + Language tierce classe.

3
Keyur Hirani

Je pense que la réponse de KababChi était juste. Cependant, dans les versions les plus récentes de Swift, NSUserDefaults a été remplacé par UserDefaults. Donc, le code ressemblerait à ceci:

UserDefaults.standard.set(languages[indexPath.row], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

L'application doit encore être redémarrée pour appliquer ces modifications.

2
jordivilagut
  1. Nécessite le redémarrage de l'application. Suivez les lignes de code ci-dessous.

    UserDefaults.standard.set (["identificateur de langue"], forKey: "AppleLanguages") UserDefaults.standard.synchronize ()

  2. Le redémarrage de l'application n'est pas nécessaire (la réponse peut nécessiter une personnalisation dans le code source fourni). Suivez le lien Web fourni.

http://www.factorialcomplexity.com/blog/2015/01/28/how-to-change-localization-internally-in-your-ios-application.html

0
iDevAmit

Pour changer de langue sans redémarrer votre appareil, vous devez changer de paquet «lproj».

Vous pouvez le faire en utilisant ce code:

class L012Localizer: NSObject {
    class func DoTheSwizzling() {
        MethodSwizzleGivenClassName(cls: Bundle.self, originalSelector: #selector(Bundle.localizedString(forKey:value:table:)), overrideSelector:
            #selector(Bundle.specialLocalizedString(key:value:table:)))
    }
}

extension Bundle {
    @objc func specialLocalizedString(key: String, value: String?, table tableName: String?) -> String {
        let currentLanguage = Localization.currentAppleLanguage()
        var bundle = Bundle();
        if let _path = Bundle.main.path(forResource: currentLanguage, ofType: "lproj") {
            bundle = Bundle(path: _path)!
        } else {
            let _path = Bundle.main.path(forResource: "Base", ofType: "lproj")!
            bundle = Bundle(path: _path)!
        }
        return (bundle.specialLocalizedString(key: key, value: value, table: tableName))
    }
}

func MethodSwizzleGivenClassName(cls: AnyClass, originalSelector: Selector, overrideSelector: Selector){

    let origMethod: Method = class_getInstanceMethod(cls, originalSelector)!;
    let overrideMethod: Method = class_getInstanceMethod(cls, overrideSelector)!;
    if (class_addMethod(cls, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
        class_replaceMethod(cls, overrideSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, overrideMethod);
    }
}

Nous échangeons ici l'implémentation de la méthode localizedString de Bundle. Remarque: nous échangeons l'implémentation et non la référence sur la fonction.

Ajoutez maintenant cette ligne dans Appdelegate dans la méthode déléguée didFinishLaunchingWithOptions.

L102Localizer.DoTheSwizzling()

Après cela, vous devez recharger vos ViewControllers. Dans votre Main.storyboard, définissez StoryboardId de Root View Controller's sur "rootnav" et collez ce code dans votre méthode qui change de langue:

let rootviewcontroller: UIWindow = ((UIApplication.shared.delegate?.window)!)!
rootviewcontroller.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "rootNav")
let mainwindow = (UIApplication.shared.delegate?.window!)!
mainwindow.backgroundColor = UIColor(hue: 0.6477, saturation: 0.6314, brightness: 0.6077, alpha: 0.8)
UIView.transition(with: mainwindow, duration: 0.55001, options: .transitionFlipFromLeft, animations: { () -> Void in
}) { (finished) -> Void in
}
0

Peut-être que le pod RSMultiLanguage est quelque chose d’utile pour vous? Je l'ai utilisé dans mes applications et il offre la possibilité de changer la langue de l'utilisateur dans l'application. Je suis sûr que vous pouvez le définir en fonction de l'emplacement de l'utilisateur avec une boucle if. De cette façon, vous pourriez ne pas avoir à redémarrer l'application.

RSMultiLanguage

Utilisation

Pour exécuter le projet exemple, clonez le référentiel et exécutez d'abord l'installation du pod à partir du répertoire Example.

Installation

RSMultiLanguage est disponible via CocoaPods. Pour l'installer, ajoutez simplement la ligne suivante à votre fichier podfile:

pod "RSMultiLanguage"

Auteur

Roy Ng, [email protected]

Licence

RSMultiLanguage est disponible sous la licence MIT. Voir le fichier LICENSE pour plus d'informations.

0
David Seek