42

每当打开本机键盘时,我都会尝试在我的 iOS 5.x 应用程序上提供不同的语言支持。以编程方式在本机键盘中提供此语言。有人可以指导我如何支持它吗?我看到了一个碳框架,但看起来像它用于 Mac 应用程序。

谢谢。

4

7 回答 7

47

您可以从 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];
}

我的 Utilities 类中还有一个自定义方法 +(NSString *)langFromLocale:(NSString *)locale,如下所示:

+ (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 属性设置为所需的语言来更改键盘输入语言。

于 2014-05-01T06:40:26.377 回答
41

我知道这是个老问题,但这是我更改键盘语言的方法。

感谢@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
    }

}
于 2017-04-26T13:46:17.270 回答
6

不,这是不可能的 - 用户只能在设置中更改他们的语言。

但是,如果您选择(或询问他们的偏好),您可以给用户一个“英文”键盘

你这样做使用:UIKeyboardTypeASCIICapable

您可以通过按底行的“地球图标”直接在键盘上更改键盘。

首先,您必须在“设置”中启用这些语言进行输入。然后按下键盘上的地球按钮将在这些语言之间切换。

于 2012-09-26T06:45:09.163 回答
5

宣言:

@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;
    }
}
于 2018-06-04T14:17:00.970 回答
5

所有很好的答案。UIResponder但在 Swift 中,您可以在扩展中覆盖父类 ( ) 中定义的方法和变量。所以没有必要子类化。很高兴for用更快速的单线替换循环。

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

而不是“表情符号”可能会像Utils.currentAppLanguage

于 2019-12-16T13:04:49.647 回答
4

斯威夫特 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
    }
}
于 2020-04-29T12:54:19.913 回答
3

例如,这似乎可以更改为希腊语键盘:

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

[[NSUserDefaults standardUserDefaults] synchronize]; 
于 2012-11-16T16:35:52.673 回答