2014-01-22 5 views
3

CultureInfo.CurrentCulture에서 반환 한 CultureInfo 인스턴스가 기본값을 모두 갖고 있는지 또는 사용자가 사용자 지정했는지 여부를 어떻게 확인할 수 있는지 알고 싶습니다.사용자가 CurrentCulture를 사용자 정의했는지 여부를 감지하는 방법은 무엇입니까?

일부 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 

그런 다음 긴 날짜 형식을 변경하여 하루 중 첫 번째 0을 숨기고, 길고 짧은 시간은 24 시간으로 설정합니다. 스 니펫이 이제이를보고합니다.

문화권 이름이 동일하게 유지되지만 변경된 속성은 새 값을 표시합니다.

제 질문은 CurrentCulture에서 반환 한 문화권이 기본값 (이 경우 en-ZA)에서 변경되었는지 여부를 알려주는 단일 속성이나 메서드가 있는지 여부입니다. CultureInfo.UseUserOverride가 그 속성일지도 모른다고 생각했지만 두 경우 모두 true를 반환합니다.

+1

"CurrentCulture"와 문화권 사이의 모든 필요한 값을 비교할 수 있다고 생각합니다. 문화권은 현재와 동일한 로케일에 대해 만듭니다. – Sinatr

+0

왜? 이상적으로는 응용 프로그램이 사용자가 자신의 컴퓨터에 설정 한 문화권에 의존해서는 안됩니다. – Grzenio

+0

예 @Sinatr, 재산을 비교할 수는 있지만 CultureInfo 클래스가 너무 풍부하여이 정보를 제공 할 수있을 것이라고 상상했습니다. –

답변

1

사용자가 문화권을 변경했는지는 묻지 않지만 사용자가 변경하지 않은 문화권을 요청할 수는 있습니다.

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

이들 중 하나에서

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

의 UseUserOverrides 속성은 거짓이 될 것입니다.

기본 문화권에서만 사용자가 데이터를 재정의 할 수 있습니다. 관리자는 사용자 지정 대체 문화권을 설치하여 모든 문화권의 데이터를 무시할 수 있습니다. CultureTypes.ReplacementCultures 플래그가 있는지 CultureTypes 속성을 확인하여이를 감지 할 수 있습니다. 이 경우 원본 데이터를 가져올 방법이 없습니다.

실제로이 동작을 기반으로 동작을 변경하는 코드를 작성하려는 경우 향후 릴리스에서 깨질 코드를 작성한 것일 수 있습니다. 버그가 수정되면 릴리스간에 데이터가 변경됩니다.