Подтвердить что ты не робот

Обнаружение текущего языка ввода iPhone

Кто-нибудь знает, могу ли я получить текущий язык ввода и/или раскладку клавиатуры в приложении iPhone? Могу ли я получить уведомление при изменении языка ввода?

4b9b3361

Ответ 1

В iOS 4.2 и более поздних версиях вы можете использовать класс UITextInputMode для определения основного языка, который в настоящее время используется для ввода текста.

[UITextInputMode currentInputMode].primaryLanguage предоставит вам NSString, представляющий код языка BCP 47, такой как "es", "en-US" или "fr-CA".

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

(Вас также может заинтересовать "Получение ваших приложений для Китая и других горячих новых рынков" , сессия WWDC и Темы программирования интернационализации.)

Ответ 2

Вы можете задать текущий первый ответчик (UITextField, UISearchBar и т.д.) с помощью метода UIResponder textInputMode:

// assume you have instance variable pointing to search bar currently entering
UITextInputMode *inputMode = [self.searchBar textInputMode];
NSString *lang = inputMode.primaryLanguage;

Ответ 3

Вы можете добавить наблюдателя в центр уведомлений по умолчанию:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(inputModeDidChange:)
                                             name:@"UIKeyboardCurrentInputModeDidChangeNotification"
                                           object:nil];

Этот метод печатает текущий выбранный язык ввода (например, "en_US" или "de_DE"):

- (void)inputModeDidChange:(NSNotification*)notification
{
    id obj = [notification object];
    if ([obj respondsToSelector:@selector(inputModeLastUsedPreference)]) {
        id mode = [obj performSelector:@selector(inputModeLastUsedPreference)];
        NSLog(@"mode: %@", mode);
    }
}

НО: Все вышеперечисленное не задокументировано, и вы не должны использовать его в транспортном коде!

Ответ 4

Из справочной библиотеки Apple - Получение текущего языка и локали":

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

Ответ 5

То, как я это сделаю, выглядит следующим образом:

  • Зарегистрируйте свой ViewController в качестве слушателя до UIApplicationDidBecomeActiveNotification

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];

  • В обработчике applicationDidBecomeActive проверьте текущий язык с помощью [NSLocale preferredLanguages] и действуйте соответствующим образом.

Этот подход дает вам то, что вы хотите, и полностью поставляется без использования частного API.

Ответ 6

В соответствии с верхними ответами следующее является общим решением для получения языка клавиатуры при его изменении. Зарегистрируйтесь для уведомления UITextInputCurrentInputModeDidChangeNotification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputModeDidChange:) name:UITextInputCurrentInputModeDidChangeNotification object:nil];

Тогда в inputModeDidChange

-(void)inputModeDidChange:(NSNotification *)notification {
   UIView *firstResponder = [UIView currentFirstResponder];
   UITextInputMode *currentInputMode =  firstResponder.textInputMode;
   NSString *keyboardLanguage = [currentInputMode primaryLanguage];
   NSLog(@"%@", keyboardLanguage); // e.g. en-US
}

Где currentFirstResponder находится из категории на UIView, чтобы получить первый вид ответчика, как предлагается в this SO post:

//  UIView+Additions.h 
#import <UIKit/UIKit.h>
@interface UIView (Additions)
+ (id)currentFirstResponder;
@end

Реализация

//  UIView+Additions.m
#import "UIView+Additions.h"
static __weak id currentFirstResponder;
@implementation UIView (Additions)
+ (id)currentFirstResponder {
    currentFirstResponder = nil;
    // This will invoke on first responder when target is nil
    [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:)
                                           to:nil
                                         from:nil
                                     forEvent:nil];
    return currentFirstResponder;
}

- (void)findFirstResponder:(id)sender {
    // First responder will set the static variable to itself
    currentFirstResponder = self;
}
@end