如何在C#中获取当前的区域设置?

时间:2009-10-09 07:48:40

标签: c# cultureinfo

通常你可以通过编写像

这样的东西来获得它

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

但是这样你只能获得在启动应用程序时配置的CultureInfo,如果之后设置已经更改,则不会更新。

那么,如何在Control Panel中配置CultureInfo - >区域和语言设置?

8 个答案:

答案 0 :(得分:29)

正如@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
    }

}

请注意,如果您还需要重置CurrentUICulture,则应单独执行

Thread.CurrentThread.CurrentUICulture.ClearCachedData()

答案 1 :(得分:6)

Thread.CurrentThread.CurrentCulture.ClearCachedData()看起来会导致文化数据在下次访问时被重新读取。

答案 2 :(得分:3)

您可以使用Win32 API函数GetSystemDefaultLCID。 签名如下:

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

GetSystemDefaultLCID函数返回LCID。它可以映射下表中的语言字符串。 Locale IDs Assigned by Microsoft

答案 3 :(得分:2)

我们使用WinForms应用程序遇到了这个问题,这是因为Visual Studio创建的[MyApp] .vshost.exe进程在Visual Studio打开时始终在后台运行。

关闭MyApp - >属性 - >调试 - > “启用Visual Studio托管过程”设置为我们修复了此问题。

vshost进程主要用于改进调试,但如果您不想禁用该设置,则可以根据需要终止该进程。

答案 4 :(得分:1)

命名空间CultureInfo中有类TextInfoSystem.Globalization。这两个类都获得了控制面板中定义的几个窗口区域设置。可用设置列表位于文档中。

例如:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator;

正在获取正在运行的程序的列表分隔符。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

尝试在SystemInformation中找到您想要的设置 使用System.Management/System.Diagnostics中的类来查找或查看WMI,您也可以使用LINQ to WMI

答案 7 :(得分:0)

这个简单的代码对我有用(避免缓存):

// Clear cached data for the current culture
Thread.CurrentThread.CurrentCulture.ClearCachedData();

// In a new thread instance we get current culture.
// This code avoid getting wrong cached cultureinfo objects when user replaces some values in the regional settings without restarting the application
CultureInfo currentCulture = new Thread(() => { }).CurrentCulture;