iPhone: изменение языка клавиатуры программно
Я пытаюсь обеспечить поддержку другого языка в моем приложении iOS 5.x каждый раз, когда открывается родная клавиатура. Обеспечить этот язык на родной клавиатуре программно. Может ли кто-нибудь направить меня, как я могу это поддержать? Я видел карбоновый каркас, но выглядит как для приложений Mac.
Благодарю.
5 ответов
Нет, это невозможно - пользователь может только изменить свой язык в настройках.
Однако вы можете дать пользователю "английскую" клавиатуру, если вы выберете (или спросите у них его предпочтения)
Вы делаете это с помощью: UIKeyboardTypeASCIICapable
Вы можете изменить клавиатуру непосредственно на клавиатуре, нажав "значок глобуса" в нижнем ряду.
Во-первых, вы должны включить этот язык для ввода в настройках. Тогда нажатие кнопки глобуса на клавиатуре будет переключаться между этими языками.
Вы можете сделать это, начиная с 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];
}
У меня также есть собственный метод +(NSString *)langFromLocale:(NSString *) локаль в моем классе утилит, которая выглядит следующим образом:
+ (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 нужный язык.
Я знаю, что это старый вопрос, но здесь я могу изменить язык клавиатуры.
Спасибо @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
}
}
Реализация Swift 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
}
}
Все отличные ответы. Но в Swift вы можете переопределить методы и переменные, определенные в родительском классе (UIResponder
) в пристройке. Таким образом, нет необходимости создавать подклассы. И приятно заменитьfor
петля с более быстрой, как однострочник.
public extension UITextField {
override var textInputMode: UITextInputMode? {
return UITextInputMode.activeInputModes.filter { $0.primaryLanguage == "emoji" }.first ?? super.textInputMode
}
}
Вместо "эмодзи" наверняка будет что-то вроде Utils.currentAppLanguage
Декларация:
@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];