web-dev-qa-db-fra.com

iPhone: changer la langue du clavier par programmation

J'essaie de fournir un support linguistique différent sur mon application iOS 5.x à chaque ouverture du clavier natif. Fournissez cette langue au clavier natif par programme. Quelqu'un pourrait-il me guider, comment puis-je le soutenir? J'ai vu un cadre carbone, mais ressemble à son pour les applications Mac.

Merci.

22
Getsy

Non, ce n'est pas possible - l'utilisateur ne peut changer que la langue dans les paramètres.

Cependant, vous pouvez donner à l'utilisateur un clavier "anglais" si vous le souhaitez (ou demandez leur préférence) 

vous faites cela en utilisant: UIKeyboardTypeASCIICapable

Vous pouvez changer de clavier directement sur le clavier en appuyant sur "icône globe" sur la rangée du bas. 

Tout d'abord, vous devez activer ces langues pour la saisie dans les paramètres. Appuyez ensuite sur le bouton globe du clavier pour basculer entre ces langues.

5
Nimit Parekh

Vous pouvez le faire à partir d'iOS 7 sur une base UIResponder. Il existe une propriété textInputMode dans la classe UIResponder. C'est en lecture seule, mais la documentation dit:

Le mode de saisie de texte identifie la langue et le clavier affichés Lorsque ce répondeur est actif.

Pour les répondants, le système affiche normalement un clavier basé sur les préférences de langue de . Vous pouvez redéfinir cette propriété et utiliser Pour renvoyer un mode de saisie de texte différent dans les cas où vous souhaitez qu'un répondeur Utilise un clavier spécifique. L'utilisateur peut toujours changer le clavier Tant que le répondeur est actif, mais en le remplaçant par un autre répondeur Puis rétablit le clavier spécifié.

Dans mon projet, j'ai créé une sous-classe de UITextField et défini une nouvelle propriété appelée userDefinedKeyboardLanguage. J'ai également remplacé la méthode textInputMode mentionnée ci-dessus. Cela ressemble à ce qui suit:

- (UITextInputMode *) textInputMode {
    for (UITextInputMode *tim in [UITextInputMode activeInputModes]) {
        if ([[Utilities langFromLocale:userDefinedKeyboardLanguage] isEqualToString:[Utilities langFromLocale:tim.primaryLanguage]]) return tim;
    }
    return [super textInputMode];
}

J'ai aussi une méthode personnalisée + (NSString *) langue locale de LangFromLocale: (NSString *) dans ma classe Utilities qui ressemble à ceci:

+ (NSString *)langFromLocale:(NSString *)locale {
    NSRange r = [locale rangeOfString:@"_"];
    if (r.length == 0) r.location = locale.length;
    NSRange r2 = [locale rangeOfString:@"-"];
    if (r2.length == 0) r2.location = locale.length;
    return [[locale substringToIndex:MIN(r.location, r2.location)] lowercaseString];
}

Maintenant, ma classe de zone de texte personnalisée peut changer la langue de saisie du clavier en définissant simplement la propriété userDefinedKeyboardLanguage dans la langue souhaitée.

41
Dima Rybachenko

Je sais que c’est une vieille question, mais ici c’est ma façon de changer la langue du clavier. 

Merci à @ the4kman pour la marque: cette manière peut changer le clavier actuel uniquement à ceux ajoutés dans les paramètres.

Swift 3:

class CustomTextField: UITextField {

    private func getKeyboardLanguage() -> String? {
        return "en" // here you can choose keyboard any way you need
    }

    override var textInputMode: UITextInputMode? {
        if let language = getKeyboardLanguage() {
            for tim in UITextInputMode.activeInputModes {
                if tim.primaryLanguage!.contains(language) {
                    return tim
                }
            }
        }
        return super.textInputMode
    }

}
23
kotvaska

Cela semble fonctionner pour changer, par exemple, à un clavier grec:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"el", nil] 
    forKey:@"AppleLanguages"]; 

[[NSUserDefaults standardUserDefaults] synchronize]; 
3
jmarch

Déclaration:

@IBOutlet var yourTextField:cTextField!;

Utilisation:

yourTextField.languageCode = "ru";

Classe cTextField:

class cTextField: UITextField {

    // ru, en, ....
    var languageCode:String?{
        didSet{
            if self.isFirstResponder{
                self.resignFirstResponder();
                self.becomeFirstResponder();
            }
        }
    }

    override var textInputMode: UITextInputMode?{
        if let language_code = self.languageCode{
            for keyboard in UITextInputMode.activeInputModes{
                if let language = keyboard.primaryLanguage{
                    let locale = Locale.init(identifier: language);
                    if locale.languageCode == language_code{
                        return keyboard;
                    }
                }
            }
        }
        return super.textInputMode;
    }
}
1