2012-03-23 30 views
6

Xin chào những người đam mê đồngParsing thông tin văn hóa trong .NET

Tôi đang làm việc với một API trả về một số thông tin về dòng âm thanh trong một tập tin, cụ thể hơn là ngôn ngữ âm thanh trong tên ISO ba chữ của nó (ISO 639-2) đại diện .

Tôi muốn phân tích thông tin này thành đối tượng CultureInfo mới, nhưng không có hàm tạo nào có mã ba chữ cái. Tất nhiên tôi có thể viết một câu chọn lựa chọn rất lớn (chuyển đổi cho bạn những người C#), nhưng tôi nghĩ nó sẽ tiết kiệm chi phí hơn để hỏi xung quanh một cách tốt hơn trước. Vì vậy, tôi không may mắn hay là có một cách bí mật để tạo ra một đối tượng CultureInfo bằng cách sử dụng ba tên chữ?

+0

Tôi không nghĩ rằng có một cách tốt để đi theo hướng ngược lại. Ví dụ: ** eng ** có thể nằm trong khoảng từ ** en-029 ** đến ** vi-ZW **. Bạn mong đợi điều này như thế nào nếu bạn đọc ** eng **? –

Trả lời

5

EDIT: xin lỗi, tôi đã sử dụng tài sản sai:

public static CultureInfo FromISOName(string name) 
{ 
    return CultureInfo 
     .GetCultures(CultureTypes.NeutralCultures) 
     .FirstOrDefault(c => c.ThreeLetterISOLanguageName == name); 
} 

Tuy nhiên, vẫn còn trùng lặp trong danh sách và không hỗ trợ "dut".

+0

Đóng, nhưng không có xì gà. :( Nó không thành công khi có nhiều hơn một mã thư cho cùng một ngôn ngữ (ví dụ: cả "dut" và "nld" được sử dụng cho tiếng Hà Lan, khung không nhận ra "dut") Rõ ràng Microsoft đã chọn để bao gồm –

+0

Tôi sẽ đánh dấu câu trả lời này là câu trả lời vì nó gần nhất với khung thực hiện hiện tại của mã ISO 639-2 –

+0

Tôi đã phát hiện ra rằng chỉ có 21 ngôn ngữ có cả một mã thư mục và một thuật ngữ mã.Nó không phải là quá nhiều nỗ lực để chuyển đổi giữa hai và phương pháp này hoạt động tốt sau khi chuyển đổi –

0

Không có gì được tích hợp trong đó sẽ giúp phân tích cú pháp như vậy.

Thay vì chọn, bạn có thể tạo Dictionary(Of string, CultureInfo) để ánh xạ từ cái này sang cái kia. Đây là một đề xuất dễ sử dụng hơn.

2

Tôi sẽ tìm giải pháp Balazs, nhưng tốt hơn hết là bạn nên sử dụng CultureTypes.NeutralCultures vì ​​bạn dường như không quan tâm đến dữ liệu vùng/quốc gia.

Nó sẽ luôn luôn trả về một CultureInfo duy nhất không có nhu cầu FirstOrDefault

+0

Điều đó chắc chắn sẽ giải quyết vấn đề tôi đưa ra. –

0

Dưới đây là một phương pháp mở rộng cho lớp Silverlight System.Globalization.CultureInfo, mà được mã ba ký tự ISO 639-2 cho ngôn ngữ của đối tượng hiện tại System.Globalization.CultureInfo . Nó sử dụng ISO-639-2 table, được truy xuất thông qua phương thức tùy chỉnh Utils.GetResourceStream().

Việc triển khai cũng dựa trên tùy chỉnh String.NthIndexOf() method.

public static string ThreeLetterISOLanguageName(this CultureInfo cultureInfo) 
{ 
    const string separator = "|"; 

    using (var reader = new StreamReader(Utils.GetResourceStream("ISO-639-2_utf-8.txt"))) 
    { 
     while (!reader.EndOfStream) 
     { 
      string line = reader.ReadLine(); 
      //two-letter ISO code is in the third column, i.e. after the second separator character 
      string twoLetterISOCode = line.Substring(line.NthIndexOf(separator, 1) + separator.Length, 2); 
      if (!twoLetterISOCode.Equals(cultureInfo.TwoLetterISOLanguageName)) continue; 
      return line.Substring(0, 3); 
     } 
    } 

    return null; 
} 

Full Gist

Các vấn đề liên quan