Страницы

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

пятница, 28 февраля 2020 г.

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

#c_sharp


Первое что делаю это собираю информацию о языках в системе:

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("Определён Русский!");
}


Но он не определяет его.
Может Я не так его определяю?

Как решить задачу?
    


Ответы

Ответ 1



Использованный вами способ не будет правильно работать в консольном приложении, только в приложении 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);

Ответ 2



Используйте свойство Culture для InputLanguage, чтобы узнать, на каком языке основан макет клавиатуры. string iso6391TwoLetterCode = InputLanguage.CurrentInputLanguage.Culture.TwoLetterISOLanguageName; switch(iso6391TwoLetterCode) { case "ru": Console.WriteLine("Russian is defined!"); break; case "en": Console.WriteLine("English is defined!"); break; case "de": Console.WriteLine("German is defined!"); break; default: Console.WriteLine("Some other language is defined!"); break; }

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

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