找到当前的用户语言

时间:2011-12-21 10:57:28

标签: excel vba excel-vba excel-2010

如何在程序中说出当前的用户语言?

我需要这个以适当的语言显示表单。

5 个答案:

答案 0 :(得分:14)

我的初始代码(使用此vbforum code)假设Windows和Excel共享一种共同语言 - 可能但不是防弹。

更新

修订后的代码:

  1. 返回区域设置ID(LCID)。
  2. msft link
  3. 查找LCID
  4. 使用解析LCID以获取语言。
  5. 我的机器下面的示例输出

    如果访问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 :(得分:11)

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

答案 2 :(得分:0)

$ gcc -Wall -Wextra -Wpedantic bug.cc  -lstdc++
$ ./a.out 
$ clang -Wall -Wextra -Wpedantic bug.cc  -lstdc++
$ ./a.out 
$ 

直接离开这里:https://bettersolutions.com/vba/macros/region-language.htm

相关文档:https://docs.microsoft.com/en-us/office/vba/api/excel.xlapplicationinternational

答案 3 :(得分:0)

这是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

答案 4 :(得分:0)

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

如果用户通过 Windows 控制面板更改其 Windows 显示语言,则此应用程序级别设置不会更改。在这种情况下,我们可以使用这个内核 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 获取语言标签、语言名称。