web-dev-qa-db-ja.com

iPhone:プログラムでキーボードの言語を変更する

ネイティブキーボードを開くたびに、iOS 5.xアプリケーションで別の言語サポートを提供しようとしています。プログラムでこの言語をネイティブキーボードで提供します。誰かが私にそれをどのようにサポートできるかを教えてくれませんか?カーボンフレームワークを見ましたが、Macアプリのフレームワークのように見えます。

ありがとう。

33
Getsy

いいえ、これは不可能です-ユーザーは設定で言語を変更することしかできません。

ただし、選択した場合(またはユーザーに好みを尋ねる場合)は、ユーザーに「英語」キーボードを提供できます。

これは次のようにして行います:UIKeyboardTypeASCIICapable

下段の「地球アイコン」を押すとキーボードから直接キーボードを変更できます。

まず、設定でこれらの言語を入力できるようにする必要があります。次に、キーボードの地球ボタンを押すと、それらの言語が切り替わります。

6
Nimit Parekh

UIResponderごとにiOS 7から開始できます。 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プロパティを目的の言語に設定するだけで、キーボード入力言語を変更できます。

44
Dima Rybachenko

私はそれが古い質問であることを知っていますが、ここでキーボードの言語を変更する私の方法です。

マークの@ 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
    }

}
31
kotvaska

宣言:

@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]; 
3
jmarch

すべての素晴らしい答え。しかし、Swiftでは、拡張機能で親クラス(UIResponder)で定義されたメソッドと変数をオーバーライドできます。そのため、サブクラス化する必要はありません。そして、forループを追加Swiftワンライナーのように。

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

「絵文字」の代わりに、おそらくUtils.currentAppLanguage

0
Au Ris