Страницы

Поиск по вопросам

пятница, 15 февраля 2019 г.

Как проверить раскладку клавиатуры на нужный язык?

Первое что делаю это собираю информацию о языках в системе:
public static InputLanguage GetLanguage(string language) { language = language.ToLower(); foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) { if (lang.LayoutName.ToLower() == language) { return lang; } } return null; }
Затем пробую проверить язык тот или не тот через функцию if
if(InputLanguage.CurrentInputLanguage == GetLanguage("us")) { Console.Write("Определён Английский!"); } else if (InputLanguage.CurrentInputLanguage == GetLanguage("ru")) { Console.Write("Определён Русский!"); }
Но он не определяет его. Может Я не так его определяю?
Как решить задачу?


Ответ

Использованный вами способ не будет правильно работать в консольном приложении, только в приложении WinForms.
В консоли на данный момент мне удалось однозначно получить только язык ввода по-умолчанию и системную локаль. С текущей раскладкой пока не далось справиться даже через WinAPI (подсмотрено тут), возвращает только язык ввода по-умолчанию. Если найдется решение, допишу сюда же.
Ошибки в текущем решении и способы их устранения ниже:
Вы некорректно сравниваете названия языков. Если хотите использовать двух-буквенные обозначения, то исправьте условие в GetLanguage на такое
... if (lang.Culture.TwoLetterISOLanguageName == language) ...
В таком случае английский будет обозначен как en, а не us, независимо от конкретной его вариации.
Если нужно учитывать вариант языка, то замените условие на такое:
... if (lang.Culture.Name == language) ...
и используйте стандартные обозначения языков: en-US, ru-RU При сравнении объектов InputLanguage нельзя использовать оператор ==, так как он будет сравнивать только ссылки на объекты InputLanguage. Вместо этого используйте метод Equals, который в данном классе переопределен и возвращает корректный ответ при эквивалентности языков.
... if (InputLanguage.CurrentInputLanguage.Equals(GetLanguage("ru"))) ...

Список всех языков, которые знает ваша система, их названия и атрибуты можно получить так
var culture = CultureInfo.GetCultures(CultureTypes.AllCultures);

Комментариев нет:

Отправить комментарий