查找当前用户语言

16

程序中,如何判断当前用户的语言?

我需要这个来展示适合语言的表单。


我认为更通用的 excel 标签始终是有用的,因为它使未来的搜索更容易。 - Fionnuala
5个回答

20

我的初始代码(利用这个 vbforum code)假设Windows和Excel共享一种通用语言-很可能但不是绝对可靠。

更新:

修改后的代码:

  1. 返回区域设置ID(LCID)。
  2. 从这个 msft link查找LCID。
  3. 使用解析LCID以获取语言。

我的计算机上的示例输出如下所示:

如果访问LCID网站或解析国家名称时出现任何错误,代码将告知用户。

enter image description here

    Sub GetXlLang()
        Dim lngCode As Long
        lngCode = Application.LanguageSettings.LanguageID(msoLanguageIDUI)
        MsgBox "Code is: " & lngCode & vbNewLine & GetTxt(lngCode)
    End Sub

    Function GetTxt(ByVal lngCode) As String
        Dim objXmlHTTP As Object
        Dim objRegex As Object
        Dim objRegMC As Object
        Dim strResponse As String
        Dim strSite As String

        Set objXmlHTTP = CreateObject("MSXML2.XMLHTTP")
        strSite = "http://msdn.microsoft.com/en-us/goglobal/bb964664"

        On Error GoTo ErrHandler
        With objXmlHTTP
            .Open "GET", strSite, False
            .Send
            If .Status = 200 Then strResponse = .ResponseText
        End With
        On Error GoTo 0

        strResponse = Replace(strResponse, "</td><td>", vbNullString)
        Set objRegex = CreateObject("vbscript.regexp")
        With objRegex
            .Pattern = "><td>([a-zA-Z- ]+)[A-Fa-f0-9]{4}" & lngCode                    
            If .Test(strResponse) Then
                Set objRegMC = .Execute(strResponse)
                GetTxt = objRegMC(0).submatches(0)
            Else
                GetTxt = "Value not found from " & strSite
            End If
        End With
        Set objRegex = Nothing
        Set objXmlHTTP = Nothing
        Exit Function
ErrHandler:
        If Not objXmlHTTP Is Nothing Then Set objXmlHTTP = Nothing
        GetTxt = strSite & " unable to be accessed"
    End Function

1
非常感谢。它做到了我想要的。我用LOCALE_SISO639LANGNAME = &H59替换了LOCALE_SNATIVELANGNAME = &H4,以获得本地独立值。 - BetaRide
1
你们能否指导我如何在识别位置后显示适当的语言...如果你们有不同的资源文件...那么如何在Excel的VBA编辑器中制作这些文件呢...??? - umair.ali

11
dim lang_code as long
lang_code = Application.LanguageSettings.LanguageID(msoLanguageIDUI)

谢谢,这个可以用。但是我只得到了一个数字。我怎么才能找出这个数字代表的真实语言呢? - BetaRide
9
您可以在此处找到LCID列表:http://msdn.microsoft.com/en-us/goglobal/bb964664。 - Charles Williams
请参考 learn.microsoft.com 页面 - Naresh

1
这是brettdj发布的代码的另一种变体。
Sub Test_GetLocale_UDF()
Dim lngCode As Long

lngCode = Application.LanguageSettings.LanguageID(msoLanguageIDUI)
MsgBox "Code Is: " & lngCode & vbNewLine & GetLocale(lngCode)
End Sub

Function GetLocale(ByVal lngCode) As String
Dim html            As Object
Dim http            As Object
Dim htmlTable       As Object
Dim htmlRow         As Object
Dim htmlCell        As Object
Dim url             As String

Set html = CreateObject("htmlfile")
Set http = CreateObject("MSXML2.XMLHTTP")
url = "https://www.science.co.il/language/Locale-codes.php"

On Error GoTo ErrHandler
    With http
        .Open "GET", url, False
        .send
        If .Status = 200 Then html.body.innerHTML = .responseText
    End With
On Error GoTo 0

Set htmlTable = html.getElementsByTagName("table")(0)

For Each htmlRow In htmlTable.getElementsByTagName("tr")
    For Each htmlCell In htmlRow.Children
        If htmlCell.innerText = CStr(lngCode) Then
            GetLocale = htmlRow.getElementsByTagName("td")(0).innerText
            Exit For
        End If
    Next htmlCell
Next htmlRow

If GetLocale = "" Then GetLocale = "Value Not Found From " & url

Exit Function
ErrHandler:
If Not http Is Nothing Then Set http = Nothing
GetLocale = url & " Unable To Be Accessed"
End Function

0

-1

VBA Application.LanguageSettings.LanguageID(msoLanguageIDUI) 只能获取 Microsoft Office Access 或者 Microsoft Excel 用户界面语言,但不能反映用于 Windows 显示的 Windows 系统显示语言,如 MsgBox() 按钮等。

如果用户通过 Windows 控制面板更改了他的 Windows 显示语言,则这个应用程序级别的设置将不会改变。在这种情况下,我们可以使用该 Kernel dll 函数来获取新的 LCID (Microsoft 语言代码标识符,1036=法语,1033=英语,...), 在一个 VBA 模块中使用以下代码:

Private Declare Function GetUserDefaultUILanguage Lib "kernel32.dll" () As Long

Public Function winGetUserDefaultUILanguage()
  winGetUserDefaultUILanguage = GetUserDefaultUILanguage()
End Function

然后您可以在 VBA 代码的任何位置调用公共函数 winGetUserDefaultUILanguage() 来获取 Windows LCID。

内核 DLL 函数 GetUserDefaultUILanguage() 将通过 Windows 显示语言 ID 反映更改。


例如,因为我的Windows显示语言是法语,LCID=1036,所以我的Office也是用法语(LCID=1036)。

enter image description here

VBA 调试器控制台:

enter image description here


现在我们通过控制面板将显示语言切换为英语Windows(LCID=1033),但我的Office语言ID保持不变(LCID=1036):

enter image description here

VBA调试器控制台:

enter image description here

通过 LCID,您可以从Microsoft API documents herehere进一步获取语言标签和语言名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接