Определение текущего языка ввода iPhone - PullRequest
18 голосов
/ 12 сентября 2009

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

Ответы [ 6 ]

29 голосов
/ 22 февраля 2012

В iOS 4.2 и более поздних версиях вы можете использовать класс <a href="https://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextInputMode_Class/Reference/Reference.html">UITextInputMode</a>, чтобы определить основной язык, используемый в настоящее время для ввода текста.

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

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

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

17 голосов
/ 14 апреля 2014

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

// assume you have instance variable pointing to search bar currently entering
UITextInputMode *inputMode = [self.searchBar textInputMode];
NSString *lang = inputMode.primaryLanguage;
8 голосов
/ 12 сентября 2009

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

[[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);
    }
}

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

5 голосов
/ 12 сентября 2009

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

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
1 голос
/ 14 августа 2015

В соответствии с основными ответами, ниже приводится общее решение для получения языка клавиатуры при его изменении. Зарегистрируйтесь для получения уведомления 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, чтобы получить первое представление респондента, как предложено в этом SO сообщении:

//  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
1 голос
/ 06 февраля 2012

Я бы сделал так:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...