2009-10-09 17 views
24

通常はC#の現在の地域設定を取得するには?

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

のようなものを書くことによってそれを得ることができますが、現時点のアプリケーションで構成された、あなただけのCultureInfoを取得することができ、この方法は、開始されたと設定が、その後変更されている場合は更新されません。

現在、コントロールパネル - >地域と言語の設定でCultureInfoを設定する方法はありますか?

答えて

28

LINQ to WMIを使用することができます。しかし、MSDNによると:

ClearCachedData方法は だから、あなたが最初の関数を呼び出してから、開始する必要があります 既存のスレッド

ため Thread.CurrentCultureプロパティ内の情報は更新されません。新しいスレッド。この新しいスレッドでは、CurrentCultureを使用してカルチャの新しい値を取得できます。あなたもCurrentUICultureのをリセットする必要がある場合は、あなたがそれを行う必要があることを

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 
    } 

}

注意、別途

Thread.CurrentThread.CurrentUICulture.ClearCachedData() 
+0

ニースダーリン! –

+0

エラーが発生しました型または名前空間の名前 'State'が見つかりませんでした(使用するディレクティブまたはアセンブリ参照がありません): var thread = new Thread( s =>((State) s).Result = Thread.CurrentThread.CurrentCulture); 問題は状態参照にあります。どのようにこれを解決するための任意のアイデアですか? Tks – Pascal

+0

@Pascal、 'State'は' Program'クラスの中で定義したプライベートクラスですが、それを外部化して公開することができます。また、 '状態'はおそらく非常に良い名前ではないので、より意味のある何かに名前を変更してみてください。 –

6

Thread.CurrentThread.CurrentCulture.ClearCachedData()これは、次回のアクセス時にカルチャデータが再読み込みされるように見えます。 @ChristianがClearCachedDataを使用する方法であり、提案されているよう

0

SystemInformation クラスで必要な設定を見つけるかSystem.Management/System.Diagnosticsのクラスを使用してWMIに見てみてください、あなたも

2

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

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

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

+1

この問題を特定できませんでした....このソリューションは私たちのために働いた!!ありがとうございましたjjacka !!!! – Jamie

3

Win32 API関数GetSystemDefaultLCIDを使用できます。 signitureは以下の通りである:

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

GetSystemDefaultLCID関数は、LCIDを返します。それはfolowingテーブルから言語の文字列をマップすることができます。 Locale IDs Assigned by Microsoft

+0

これに似ていますが、私はGetUserDefaultLCID()を代わりに使用しましたが、私はユーザー設定を取得しました。私はシステムのデフォルトがインストール済みのロケールだと思います。 – Colin

+0

[DllImport( "kernel32.dll")] 静的なextern int GetSystemDefaultLCID(); var name = new System.Globalization.CultureInfo(GetSystemDefaultLCID())。名前。 –

1

名前空間System.GlobalizationのクラスCultureInfoTextInfoがあります。どちらのクラスも、コントロールパネルで定義された複数のウィンドウの地域設定を取得します。使用可能な設定の一覧は、ドキュメントに記載されています。例えば

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

が実行されているプログラムのリストセパレータを得ています。

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

public static CultureInfo CurrentCultureInRegionalSettings => new CultureInfo(GetUserDefaultLCID()); 
関連する問題