.NET 可以轻松获取当前系统的语言信息,当你想做一个支持多语言的程序时,可以通过CultureInfo的数据来加载不同的资源文件,用以支持国际化。

但是某些语言可能并不只有当地可以使用,就比如港澳台都使用繁体中文,而大陆和新加坡使用的是简体中文,美式英语和英式英语虽有部分区别、但大部分单词都是相同的。如果为每一个不同地区的人都准备不同的语言资源包,不仅繁琐而且浪费。

其实 .NET 的 CultureInfo 是具有继承关系的,比如 en-USen-UK 都是继承自 en;而简体中文 zh-CNzh-SG 则继承自 zh-CHS,繁体中文 zh-TWzh-HKzh-MO 都是继承自 zh-CHT,而且它们最底层都是继承自 zh

因此,我写了一个可追溯当前系统语言的静态方法,可以帮助你直接枚举出当前语言的所有语言描述文本,可以让你更好地重用语言包资源。

比如你准备给简体中文和繁体中文各应用不同的资源包,那么就可以将简中资源包命名为 zh-CHS.lang,而繁中资源包命名为 zh-CHT.lang
甚至,如果你更懒,只准备提供一个中文语言包,你就可以直接命名为 zh.lang,英文资源也可以直接使用 en.lang

又或者,你的程序语言搜寻过程更智能的话,也可以直接通过检测是否有指定的语言包文件,如果不存在就向上搜寻父语言包文件的方式,来提供不同精度的差异化语言包。


获取语言信息的代码:
Shared Function getLangInfo(Optional ByVal langName As String = Nothing) As String()
    Dim cinfo As Globalization.CultureInfo
    If langName = Nothing Then
        cinfo = Globalization.CultureInfo.InstalledUICulture
    Else
        Try
            'cinfo = Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag(langName)
            cinfo = New Globalization.CultureInfo(langName)
        Catch ex As Exception
            Return Nothing
        End Try
    End If

    If cinfo Is Globalization.CultureInfo.InvariantCulture Then
        Return Nothing
    End If

    Dim slist As New List(Of String)
    Do
        slist.Add(cinfo.Name)
        cinfo = cinfo.Parent
    Loop Until cinfo Is Globalization.CultureInfo.InvariantCulture

    Return slist.ToArray
End Function