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