Как узнать установленный язык на Windows?

Рейтинг: 1Ответов: 1Опубликовано: 18.03.2023

Хочу узнать язык, которой стоит на Windows у пользователя. Как это можно сделать? Есть ли библиотека, или куда обратиться в системе?

CultureInfo - здесь не очень подходит, он показывает региональные параметры.

Насчёт регистра. У меня стоит Win 10 на английском (изначально был на русском) введите сюда описание изображения

Если доставать значения из регистра, то InstallLanguage почему-то с кодом 0419 (ru-Ru).

введите сюда описание изображения введите сюда описание изображения

Есть InstallLanguageFallback со значением en-Us. Но не получается достать, это значение.

введите сюда описание изображения

Код:

const string path = @"SYSTEM\CurrentControlSet\Control\Nls\Language";
using RegistryKey key = Registry.LocalMachine.OpenSubKey(path);
string value = key.GetValue("InstallLanguage") as string;
if (int.TryParse(value, NumberStyles.HexNumber, null, out int lcid))
{
  CultureInfo info = new CultureInfo(lcid);
  Console.WriteLine(info.DisplayName);
  Console.WriteLine(info.IetfLanguageTag);
}

Вывод:

Russian (Russia)
ru-RU

Возможно проблема в особенность моей ОС.

Ответы

▲ 1Принят

CultureInfo.InstalledUICulture

CultureInfo systemCulture = CultureInfo.InstalledUICulture;

Если нужно узнать не язык дистрибутива, а текущий MUI, то попробуйте получить значение из реестра

HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language\

введите сюда описание изображения

Пример кода

const string path = @"SYSTEM\CurrentControlSet\Control\Nls\Language";
using RegistryKey key = Registry.LocalMachine.OpenSubKey(path);
string value = key.GetValue("InstallLanguage") as string;
if (int.TryParse(value, NumberStyles.HexNumber, null, out int lcid))
{
    CultureInfo info = new CultureInfo(lcid);
    Console.WriteLine(info.DisplayName);
    Console.WriteLine(info.IetfLanguageTag);
}

Вывод в консоль (у меня английский язык системы)

English (United States)
en-US

Из REG_MULTI_SZ строку можно получить так

string lang = (key.GetValue("InstallLanguageFallback") as string[])?.FirstOrDefault(x => x?.Length > 0);