【问题标题】:Parsing three-letter language names as culture info将三字母语言名称解析为文化信息
【发布时间】:2012-03-23 14:36:18
【问题描述】:

我正在使用一个 API,该 API 返回有关文件中音频流的一些信息,更具体地说,是其三字母 ISO 名称 (ISO 639-2) 表示形式的音频语言。

我想将此信息解析成一个新的CultureInfo 对象,但没有构造函数采用三字母代码。我当然可以编写一个巨大的 select 语句(为 C# 人员切换),但我认为首先询问更好的方法会更具成本效益。 那么是我运气不好还是有什么秘密方法可以使用三个字母名称创建 CultureInfo 对象?

【问题讨论】:

  • 我认为没有什么好的方法可以反其道而行之。例如,eng​​b> 的范围可以从 en-029en-ZW。如果您阅读 eng​​b>,您希望它的表现如何?

标签: .net vb.net parsing cultureinfo


【解决方案1】:

编辑:抱歉,我使用了错误的属性:

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

但是,列表中仍然存在重复,并且不支持“dut”。

【讨论】:

  • 关闭,但没有雪茄。 :( 当同一种语言有多个字母代码时,它会失败(例如:“dut”和“nld”都用于荷兰语,框架无法识别“dut”)。显然微软选择只包含一个每种语言的字母代码,非常不幸。
  • 我会将其标记为答案,因为它与 ISO 639-2 代码的当前框架实现最接近。
  • 我发现只有 21 种语言同时具有书目代码和术语代码。两者之间转换并不费力,转换后这种方法效果很好。
【解决方案2】:

我会选择 Balazs 解决方案,但在您的情况下使用 CultureTypes.NeutralCultures 会更好,因为您似乎并不关心地区/国家数据。

它总是会返回一个不需要 FirstOrDefault 的 CultureInfo

【讨论】:

    【解决方案3】:

    没有任何内置功能可以帮助进行此类解析。

    您可以创建一个Dictionary(Of string, CultureInfo) 来从一个映射到另一个,而不是选择。这更像是一个易于使用的建议。

    【讨论】:

      【解决方案4】:

      这是 Silverlight System.Globalization.CultureInfo 类的扩展方法,它获取当前 System.Globalization.CultureInfo 对象语言的 ISO 639-2 三字母代码。它使用ISO-639-2 table,通过Utils.GetResourceStream() 自定义方法检索。

      该实现还依赖于自定义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

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        相关资源
        最近更新 更多