web-dev-qa-db-ja.com

C#で現在の地域設定を取得するにはどうすればよいですか?

通常、次のように書くことでそれを得ることができます

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

ただし、この方法では、アプリケーションの起動時に構成されたCultureInfoのみを取得でき、後で設定が変更されている場合は更新されません。

では、コントロールパネルで現在設定されているCultureInfoを取得する方法->地域と言語の設定

24
Shuric

@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()
29
Darin Dimitrov

Thread.CurrentThread.CurrentCulture.ClearCachedData()は、次にアクセスされたときにカルチャデータを再読み取りするように見えます。

6

Win32 API関数GetSystemDefaultLCIDを使用できます。署名は次のとおりです。

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

GetSystemDefaultLCID関数はLCIDを返します。次の表から言語文字列をマッピングできます。 Microsoftによって割り当てられたロケールID

3
Mark Green

WinFormsアプリでこの問題が発生したのは、Visual Studioが開いているときは常にバックグラウンドで実行されている[MyApp] .vshost.exeプロセスをVisual Studioが作成したためです。

MyApp->プロパティ->デバッグ-> "Visual Studioホスティングプロセスを有効にする"設定をオフにすると、これが修正されました。

vshost プロセスは主にデバッグを改善するために使用されますが、設定を無効にしたくない場合は、必要に応じてプロセスを強制終了できます。

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

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

名前空間からのクラスCultureInfoTextInfoがありますSystem.Globalization。どちらのクラスも、コントロールパネルで定義されたいくつかのウィンドウの地域設定を取得します。利用可能な設定のリストはドキュメントにあります。

例えば:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator;

実行中のプログラムのリストセパレータを取得しています。

1
Nicolas

SystemInformationクラスで必要な設定を見つけるか、System.Management/System.Diagnosticsのクラスを使用してWMIを調べてみてください LINQ to WMI も使用できます

0
Arsen Mkrtchyan