5

CultureInfo.CurrentCulture によって返される CultureInfo インスタンスにすべてのデフォルト値があるかどうか、またはユーザーによってカスタマイズされているかどうかを判断する方法を知りたいです。

次の LINQPad スニペットと LINQPad コマンド ライン ランナーを使用していくつかのテストを行いました。

var ci = CultureInfo.CurrentCulture;
var dtf = ci.DateTimeFormat;

ci.Name.Dump("CultureInfo");
dtf.FullDateTimePattern.Dump("FullDateTimePattern");
dtf.LongDatePattern.Dump("LongDatePattern");
dtf.LongTimePattern.Dump("LongTimePattern");

地域ダイアログで形式として英語 (南アフリカ)を選択すると、スニペットは次のように報告します。

E:\Junk>lprun CurrentCulture.linq
CultureInfo: en-ZA
FullDateTimePattern: dd MMMM yyyy hh:mm:ss tt
LongDatePattern: dd MMMM yyyy
LongTimePattern: hh:mm:ss tt

次に、長い日付形式を変更して、その日の先頭のゼロを非表示にし、長い時間と短い時間を 24 時間に変更します。スニペットはこれを報告するようになりました。

E:\Junk>lprun CurrentCulture.linq
CultureInfo: en-ZA
FullDateTimePattern: d MMMM yyyy HH:mm:ss
LongDatePattern: d MMMM yyyy
LongTimePattern: HH:mm:ss

カルチャ名は同じままですが、変更したプロパティは新しい値を示しています。

私の質問は、CurrentCulture によって返されるカルチャが既定値 (この場合は en-ZA) から変更されているかどうかを教えてくれる単一のプロパティまたはメソッドがあるかどうかです。CultureInfo.UseUserOverride がそのプロパティかもしれないと思ったのですが、どちらの場合も true を返します。

4

1 に答える 1

5

ユーザーによって文化が変更されたかどうかを尋ねることはできませんが、ユーザーによって変更されていない文化を要求することはできます。

new CultureInfo(CultureInfo.CurrentCulture.Name, false);

また

CultureInfo::GetCultureInfo(CultureInfo.CurrentCulture.Name);

これらのいずれかで、UseUserOverrides プロパティは false になります。

ユーザーがデータをオーバーライドできるのは、既定のカルチャのみです。管理者は、カスタムの置換カルチャをインストールすることで、任意のカルチャのデータをオーバーライドできます。これは、CultureTypes.ReplacementCultures フラグの存在について CultureTypes プロパティをチェックすることで検出できます。その場合、元のデータを取得する方法はありません。

これに基づいて動作を変更するコードを実際に書こうとしている場合は、おそらく将来のリリースで壊れるコードを書いていることに注意してください。バグが修正されると、データはリリース間で変更されます。

于 2014-01-22T18:25:19.547 に答える