2012-01-19 26 views
13

Được cung cấp mã quốc gia cụ thể, ví dụ: "CH", làm thế nào tôi có thể nhận được một đối tượng CultureInfo? Mã quốc gia cụ thể là động (các thay đổi khi chạy). Tôi chỉ có mã quốc gia và tôi muốn biết liệu có thể tạo đối tượng CultureInfo từ chỉ mã quốc gia hay không. Nó không quan trọng mà tôi nhận được văn hóa chính xác (fr-CH/de-CH).Nhận đối tượng CultureInfo từ tên quốc gia hoặc đối tượng RegionInfo

Tôi đang cố gắng làm điều gì đó như thế này:

CultureInfo c = CultureInfo.CreateSpecificCulture("CH"); 

Nó sẽ có thể để tạo ra một nền văn hóa từ một đối tượng RegionInfo? Sau đó, nó sẽ trông như thế này:

RegionInfo r= new RegionInfo("CH"); 
CultureInfo c = CultureInfo.CreateSpecificCulture(r); 

Rõ ràng các ví dụ trên không biên dịch, họ chỉ đưa ra một ý tưởng về những gì tôi đang cố gắng để đạt được.

+1

Bạn mong đợi nền văn hóa nào cho Canada hoặc Bỉ? –

+1

Bạn đang tìm kiếm [CultureInfo.GetCultureInfo Method] (http://msdn.microsoft.com/en-us/library/yck8b540.aspx)? –

+0

Đối với *** US *** bạn nhận được 'chr-US en-US es-US và haw-US': _Cheroqui, tiếng Anh, tiếng Tây Ban Nha, Hawai_ – Kiquenet

Trả lời

21

Nếu bạn chỉ có mã quốc gia, bạn có thể sử dụng một cái gì đó như thế này để có được tất cả các infos văn hóa gắn liền với đất nước rằng:

var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures) 
           .Where(c => c.Name.EndsWith("-CH")); 

EDIT: thêm - trước CH để ngăn chặn một trường hợp cạnh, như đã chỉ ra bởi @JeppeStigNielsen (xem bình luận bên dưới).

+0

hữu ích ** 'iso2 =" US ";' ** Mã: 'var cultureInfo = CultureInfo.GetCultures (CultureTypes.AllCultures). Ở đây (c => c.Name.EndsWith (iso2)). ToList(); foreach (System.Globalization.văn hóa CultureInfo trong cultureList) { Response.Write ("
Văn hóa cho dấu "+ ISO2 + ":" + culture.DisplayName +" *** "+ culture.NativeName +" "+ culture.TwoLetterISOLanguageName +" -" + culture.ThreeLetterISOLanguageName + "-" + culture.DateTimeFormat.FullDateTimePattern); } ' – Kiquenet

+1

Loại câu hỏi này xứng đáng là một câu trả lời xấu (và tôi chỉ đăng một câu trả lời khác), nhưng vẫn: Khi tôi thử mã của bạn với __Haiti__, mã quốc gia' "HT" ', một trong những nền văn hóa tôi nhận được là' "zh-CHT" ', __Chinese (Truyền thống) Legacy__, được biết đến nguyên gốc là __ 中文 (繁體) 舊版 __. –

+0

@JeppeStigNielsen Thay đổi mã ở trên để 'EndsWith (" - CH ")' sẽ là lừa hoặc bạn có thể nghĩ ra một trường hợp cạnh khác? –

4

Bạn đang cố tạo đối tượng CultureInfo? như thế này:

CultureInfo c = new CultureInfo("de-CH"); //culture for German (Switzerland) 
CultureInfo c = new CultureInfo("fr-CH"); //culure for French (Switzerland) 
CultureInfo c = new CultureInfo("it-CH"); //culture for Italian (Switzerland) 

Có thể liên kết này có thể hữu ích http://www.csharp-examples.net/culture-names/ nó hiển thị tất cả các nền văn hóa.

+0

Tôi chỉ có mã quốc gia và tôi muốn biết nếu nó là có thể tạo đối tượng CultureInfo chỉ từ mã quốc gia. Nhưng nó phải năng động. – Ben

+0

Tôi có thể nhận 'CultureInfo' bằng cách sử dụng giá trị ** HKCU \ Control Panel \ International \ Geo ** - *** Nation *** không? – Kiquenet

2

Tất nhiên đây là một điều xấu phải làm vì một quốc gia (bao gồm cả ví dụ của bạn "CH" Thụy Sĩ) có thể có nhiều ngôn ngữ.

Tuy nhiên, tôi sẽ cung cấp cho bạn hai phương pháp xấu xí. Đầu tiên:

static IEnumerable<CultureInfo> FindCandidateCultures(RegionInfo region) 
{ 
    return CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
    .Where(x => (new RegionInfo(x.Name)).GeoId == region.GeoId); 
} 

Khi sử dụng trên ví dụ cụ thể của bạn, new RegionInfo("CH"), nó mang lại, trên phiên bản của tôi về .NET Framework và phiên bản Windows của tôi:

de-CH: German (Switzerland) 
fr-CH: French (Switzerland) 
gsw-CH: Alsatian (Switzerland) 
it-CH: Italian (Switzerland) 
rm-CH: Romansh (Switzerland) 
wae-CH: Walser (Switzerland)

Phương pháp thứ hai tôi sẽ cung cấp cho bạn:

// ugly reflection, this can break any day! 
static CultureInfo ConvertToCulture(RegionInfo region) 
{ 
    var data = typeof(RegionInfo).GetField("m_cultureData", BindingFlags.NonPublic | BindingFlags.Instance) 
    .GetValue(region); 

    var name = (string)(data.GetType().GetProperty("SNAME", BindingFlags.NonPublic | BindingFlags.Instance) 
    .GetValue(data)); 

    return CultureInfo.GetCultureInfo(name); 
} 

Như là điều hiển nhiên, nó sử dụng cơ quan đại diện nội bộ của mscorlib.dll, và chúng tôi không bao giờ biết nếu nó sẽ phá vỡ với các phiên bản trong tương lai. Nhưng nó cung cấp cho bạn một cách để chọn một nền văn hóa cụ thể. Trên máy của tôi, từ new RegionInfo("CH"), bạn nhận được it-CH: Italian (Switzerland).