【问题标题】:Find the current user language查找当前用户语言
【发布时间】:2021-07-15 03:34:38
【问题描述】:

我如何知道 程序中的当前用户语言?

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

【问题讨论】:

  • @brettdj 我认为更通用的excel 始终是一个有用的标签,它使以后的搜索更容易。

标签: vba vba excel excel-2010


【解决方案1】:

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

更新

修改后的代码:

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

下面我机器上的示例输出

该代码将让用户知道在访问 LCID 网站或解析国家名称时是否有任何错误。

    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

【讨论】:

  • 非常感谢。它可以满足我的要求。我将 LOCALE_SNATIVELANGNAME = &H4 替换为 LOCALE_SISO639LANGNAME = &H59 以获得本地独立值。
  • 您能否指导我在确定位置后如何显示适当的语言...如果您有不同的资源文件...那么如何在 Excel 的 VBA 编辑器中制作这些文件...? ??
【解决方案2】:
dim lang_code as long
lang_code = Application.LanguageSettings.LanguageID(msoLanguageIDUI)

【讨论】:

【解决方案3】:

这是 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】:
    Select Case Application.International(xlApplicationInternational.xlCountryCode) 
       Case 1: Call MsgBox("English") 
       Case 33: Call MsgBox("French") 
       Case 49: Call MsgBox("German") 
       Case 81: Call MsgBox("Japanese") 
    End Select 
    

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

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

    【讨论】:

      【解决方案5】:

      VBA Application.LanguageSettings.LanguageID(msoLanguageIDUI) 仅获取 Microsoft Office Access 或 Microsoft Excel 用户界面语言。但不反映用于 Windows Display 的 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),

      VBA 调试器控制台:


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

      VBA 调试器控制台:

      从 LCID,您可以进一步从 Microsoft API documents here 或 here 获取语言标签、语言名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-24
        • 2012-09-21
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多