Определить текущий язык ввода

Я создаю приложение, которое позволяет пользователям проверять местное время в любой точке мира. Информация извлекается с использованием API Google, и все работает хорошо, но для достижения наилучших результатов мне нужно указать язык, который я хотел бы использовать.

Очевидно, что в моем случае имеет смысл установить нужный язык на тот, который пользователь использовал при наборе названия города. На iPhone это очень просто сделать, но я не могу понять, как получить этот языковой код на macOS. Может ли кто-нибудь помочь мне, пожалуйста?

Обновить

По совету Лео я сейчас нахожусь на этапе, когда получаю текущий вклад с помощью углеродного фреймворка.

let source = TISCopyCurrentKeyboardInputSource().takeUnretainedValue()
let lang = TISGetInputSourceProperty(source, kTISPropertyInputSourceLanguages).assumingMemoryBound(to: NSArray.self).pointee

Проблема в том, что TISGetInputSourceProperty() возвращает UnsafeMutableRawPointer. И я не могу найти способ преобразовать его во что-то читаемое. Я предполагаю, что это NSArray, но мне не удалось его преобразовать. Может кто-нибудь помочь, пожалуйста?


person Andriy Gordiychuk    schedule 26.11.2016    source источник
comment
Хотите узнать предпочитаемый язык в настройках «Язык и регион»?   -  person Willeke    schedule 30.11.2016
comment
Свойство — CFString.   -  person Leo Natan    schedule 01.12.2016


Ответы (2)


let source = TISCopyCurrentKeyboardInputSource().takeUnretainedValue()
let value = TISGetInputSourceProperty(source, kTISPropertyInputSourceLanguages)
if (value != nil) {
    var name = Unmanaged<AnyObject>.fromOpaque(value!).takeUnretainedValue() as? String
}

Я изучаю это здесь https://github.com/noraesae/kawa/blob/master/kawa/InputSourceManager.swift

person Haisea    schedule 29.04.2017

У Carbon есть TISCopyCurrentKeyboardInputSource(), который дает вам текущий язык.

Источник TISInputSourceRef = TISCopyCurrentKeyboardInputSource(); TISGetInputSourceProperty(источник, kTISPropertyInputSourceLanguages));

Существует также распределенное уведомление kTISNotifySelectedKeyboardInputSourceChanged для определения смены языка.

Для простоты использования Swift рассмотрите возможность создания оболочки Objective C, которая возвращает строковое значение вышеуказанного API.

person Leo Natan    schedule 26.11.2016
comment
Нет, это не работает. Если я наберу Paris или Hello, он отобразит und как язык. Действительно, было бы лучше просто получить доступ к текущему языку ввода клавиатуры.... Для длинных строк ваше решение работает, но в моем случае пользователи будут искать города, поэтому будет введено только короткое имя. - person Andriy Gordiychuk; 29.11.2016
comment
У Carbon есть TISCopyCurrentKeyboardInputSource, который дает вам текущий язык. Существует также распределенное уведомление kTISNotifySelectedKeyboardInputSourceChanged для определения смены языка. - person Leo Natan; 29.11.2016
comment
Спасибо. Я попробовал этот метод, и, похоже, он работает. Однако он возвращает UnsafeMutableRawPointer, и я не могу найти способ его правильно прочитать. Вы можете проверить мой обновленный ответ - person Andriy Gordiychuk; 29.11.2016
comment
@AndriyGordiychuk Я предлагаю использовать оболочку ObjC для рассматриваемого API. Будет намного легче. - person Leo Natan; 30.11.2016