Подтвердить что ты не робот

Как получить текущие региональные настройки в С#?

Обычно вы можете получить его, написав что-то вроде

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

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

Итак, как настроить CultureInfo в настоящее время настроено на панели управления → региональные и языковые настройки?

4b9b3361

Ответ 1

Как предложил @Christian ClearCachedData - метод. Но согласно MSDN:

Метод ClearCachedData не обновить информацию в Свойство Thread.CurrentCulture для существующие потоки

Итак, вам нужно сначала вызвать функцию, а затем запустить новый поток. В этом новом потоке вы можете использовать CurrentCulture для получения свежих значений культуры.

class Program
{
    private class State
    {
        public CultureInfo Result { get; set; }
    }

    static void Main(string[] args)
    {
        Thread.CurrentThread.CurrentCulture.ClearCachedData();
        var thread = new Thread(
            s => ((State)s).Result = Thread.CurrentThread.CurrentCulture);
        var state = new State();
        thread.Start(state);
        thread.Join();
        var culture = state.Result;
        // Do something with the culture
    }

}

Обратите внимание, что если вам также нужно reset CurrentUICulture, вы должны сделать это отдельно

Thread.CurrentThread.CurrentUICulture.ClearCachedData()

Ответ 2

Thread.CurrentThread.CurrentCulture.ClearCachedData() выглядит так, что данные культуры будут перечитываться при следующем доступе.

Ответ 3

Вы можете использовать функцию Win32 API GetSystemDefaultLCID. Это означает следующее:

[DllImport("kernel32.dll")]
static extern uint GetSystemDefaultLCID();

Функция GetSystemDefaultLCID возвращает LCID. Он может отображать строку языка из следующей таблицы. Идентификаторы локалей, назначенные Microsoft

Ответ 4

Мы столкнулись с этой проблемой с нашим приложением WinForms, и это произошло из-за того, что Visual Studio создала процесс [MyApp].vshost.exe, который всегда работает в фоновом режиме всякий раз, когда Visual Studio открыта.

Отключение настройки MyApp → Свойства → Отладка → "Включить процесс хостинга Visual Studio" исправила это для нас.

vshost в основном используется для улучшения отладки, но если вы не хотите отключать этот параметр, вы можете убить процесс по мере необходимости.

Ответ 5

В пространстве имен System.Globalization есть классы CultureInfo и TextInfo. Оба класса получают несколько региональных параметров окна, определенных в панелях управления. Список доступных настроек приведен в документации.

Например:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator;

получает разделитель списка для выполняемой программы.

Ответ 6

Попробуйте найти настройки, которые вы хотите в SystemInformation класс или посмотрите в WMI, используя классы в System.Management/System.Diagnostics, вы можете также использовать LINQ to WMI

Ответ 7

[DllImport("kernel32.dll")]
private static extern int GetUserDefaultLCID();

public static CultureInfo CurrentCultureInRegionalSettings => new CultureInfo(GetUserDefaultLCID());