#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; }
Комментариев нет:
Отправить комментарий