iPhone: изменение языка клавиатуры программно

Я пытаюсь обеспечить поддержку другого языка в моем приложении iOS 5.x каждый раз, когда открывается родная клавиатура. Обеспечить этот язык на родной клавиатуре программно. Может ли кто-нибудь направить меня, как я могу это поддержать? Я видел карбоновый каркас, но выглядит как для приложений Mac.

Благодарю.

5 ответов

Решение

Нет, это невозможно - пользователь может только изменить свой язык в настройках.

Однако вы можете дать пользователю "английскую" клавиатуру, если вы выберете (или спросите у них его предпочтения)

Вы делаете это с помощью: UIKeyboardTypeASCIICapable

Вы можете изменить клавиатуру непосредственно на клавиатуре, нажав "значок глобуса" в нижнем ряду.

Во-первых, вы должны включить этот язык для ввода в настройках. Тогда нажатие кнопки глобуса на клавиатуре будет переключаться между этими языками.

Вы можете сделать это, начиная с iOS 7, для каждого UIResponder. В классе UIResponder есть свойство textInputMode. Это только для чтения, но документация гласит:

Режим ввода текста определяет язык и клавиатуру, отображаемые, когда этот респондент активен.

Для респондентов система обычно отображает клавиатуру, которая основана на языковых предпочтениях пользователя. Вы можете переопределить это свойство и использовать его для возврата в другой режим ввода текста в тех случаях, когда вы хотите, чтобы респондент использовал определенную клавиатуру. Пользователь по-прежнему может менять клавиатуру, когда респондент активен, но переключаясь на другой респондент, а затем обратно, восстанавливает указанную вами клавиатуру.

В моем проекте я создал подкласс UITextField и определил новое свойство с именем userDefinedKeyboardLanguage. Я также переопределил вышеупомянутый метод textInputMode. Это выглядит примерно так:

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

У меня также есть собственный метод +(NSString *)langFromLocale:(NSString *) локаль в моем классе утилит, которая выглядит следующим образом:

+ (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];
}

Теперь мой пользовательский класс текстового поля может изменить язык ввода с клавиатуры, просто установив для свойства userDefinedKeyboardLanguage нужный язык.

Я знаю, что это старый вопрос, но здесь я могу изменить язык клавиатуры.

Спасибо @the4kman за отметку: таким способом можно сменить текущую клавиатуру только на ту, которая была добавлена ​​в Настройки.

Свифт 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
    }

}

Реализация Swift 5:

public extension UITextField 
{ 
    // ⚠️ Prefer english keyboards
    //
    override var textInputMode: UITextInputMode?
    {
        let locale = Locale(identifier: "en_US") // your preferred locale

        return
            UITextInputMode.activeInputModes.first(where: { $0.primaryLanguage == locale.languageCode })
            ??
            super.textInputMode
    }
}

Все отличные ответы. Но в Swift вы можете переопределить методы и переменные, определенные в родительском классе (UIResponder) в пристройке. Таким образом, нет необходимости создавать подклассы. И приятно заменитьfor петля с более быстрой, как однострочник.

public extension UITextField {  
    override var textInputMode: UITextInputMode? {
        return UITextInputMode.activeInputModes.filter { $0.primaryLanguage == "emoji" }.first ?? super.textInputMode
    }
}

Вместо "эмодзи" наверняка будет что-то вроде Utils.currentAppLanguage

Декларация:

@IBOutlet var yourTextField:cTextField!;

Использование:

yourTextField.languageCode = "ru";

Класс 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;
    }
}

Это, кажется, работает, чтобы изменить, например, греческую клавиатуру:

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

[[NSUserDefaults standardUserDefaults] synchronize]; 
Другие вопросы по тегам