在 Excal VBA 宏中使用 Azure 翻译器
Using Azure Translator in an Excal VBA macro
5 年来,我一直使用此代码在 Excel VBA 宏中将用户输入的英语文本转换为法语或德语。那是在 Microsoft Azure Marketplace 上,由于我的使用量很少,所以它是免费的。
Function MicrosoftTranslate(sText As String, Optional sLanguageFrom As String = "", Optional sLanguageTo As String = "en") As String
Dim sRequest As String, sResponseText As String
sRequest = "Translate?from=" & sLanguageFrom & "&to=" & sLanguageTo & "&text=" & sText
sResponseText = MSHttpRequest(sRequest)
'Debug.Print sResponseText
MicrosoftTranslate = StringFromXML(sResponseText)
End Function
Function MicrosoftTranslatorDetect(sText As String) As String
' returns lowercase two character code eg "fr"
MicrosoftTranslatorDetect = StringFromXML(MSHttpRequest("Detect?text=" & sText))
End Function
Function MSHttpRequest(sRequest As String) As String
Dim sURL As String, oH As Object, sToken As String
sURL = "http://api.microsofttranslator.com/V2/Http.svc/" & sRequest
sToken = GetAccessToken()
Set oH = CreateObject("MSXML2.XMLHTTP")
oH.Open "GET", sURL, False
oH.setRequestHeader "Authorization", "Bearer " & sToken
oH.send
MSHttpRequest = oH.responseText
Set oH = Nothing
End Function
Function GetAccessToken() As String
Static sAccess_Token As String, dtExpiry_Time As Date
Const OAUTH_URI As String = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"
'get Your Client ID and client secret from
'https://datamarket.azure.com/developer/applications
Const CLIENT_ID As String = "xxxxxxxxx"
Const CLIENT_SECRET As String = "1234567890abcdefghijklmnopqrstuvwxyz"
Dim sRequest As String, sResponse As String
Dim webRequest As Object
If Now() > dtExpiry_Time Then ' time for a new access token
Set webRequest = CreateObject("MSXML2.XMLHTTP")
sRequest = "grant_type=client_credentials" & _
"&client_id=" & CLIENT_ID & _
"&client_secret=" & URLEncode(CLIENT_SECRET) & _
"&scope=http://api.microsofttranslator.com"
webRequest.Open "POST", OAUTH_URI, False
webRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
webRequest.send (sRequest)
sResponse = webRequest.responseText
Set webRequest = Nothing
If InStr(1, sResponse, """error:""", vbTextCompare) > 0 Then
Err.Raise 9999, "GetAccessToken " & sResponse
End If
sAccess_Token = NameValue("access_token", sResponse)
dtExpiry_Time = Now() + Val(NameValue("expires_in", sResponse)) / 60 / 60 / 24 ' maybe *.95 for safety margin
'Debug.Print "Token expires at "; Format$(dtExpiry_Time, "hh:mm:ss")
End If
GetAccessToken = sAccess_Token
End Function
现在有了新的 Microsoft Azure,我的搭便车似乎结束了。所以现在我需要转换我的 VBA 代码。我看了看,但还没有找到一个很好的参考资料来帮助转换附加的例程。我在 VBA 方面还不错,但需要帮助才能实现这些新功能。
谁能帮助我或指出一些参考资料(对于像我这样的新手),这将使我能够使用新系统。
得到东西后运行我可以决定这个小应用程序是否值得我花钱。
谢谢.....RDK
实际上,Azure Coginitve 服务中的转换器 API 从免费套餐开始。 https://www.microsoft.com/cognitive-services/en-us/pricing
新API的主要区别在于获取令牌的方式。 http://docs.microsofttranslator.com/oauth-token.html
其他的我觉得也是一样的。你可以在这里找到参考:
docs.microsofttranslator.com/text-translate.html
我在 Access 中使用此代码翻译单行文本
VBA
中的翻译器代码
Function TranslatorTextAPI(sText As String)
'Single step translation code
'for Key info if authentication is failing goto https://portal.azure.com/ log in and refresh keys and update Key information below
'if you cannot find keys you can create new azure account goto link below it is a free service for less then 2 million words
'https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
If Len(sText) > 0 Then 'if blank do nothing return the blank value
Dim sHost As String
Dim zTTxt As String
Dim zKey As String
Dim startpl, endpl As Integer
zKey = "subscriptionKey" 'authentication Key from subscription
sHost = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0" 'required link for authentication
sHost = sHost & "&from=fr&to=en" 'determine language from and langauge to
zTTxt = "[{""text"":" & """" & sText & """}]" 'JSON format spcific requirement [{"text":"value"}] max 5000 characters
Dim Tlang As Object
Set Tlang = CreateObject("WinHttp.WinHttpRequest.5.1") 'need to add reference libary "Microsft WinHTTP Service,Version 5.1"
Tlang.Open "POST", sHost, False 'open connection to "Translator Text API" POST command required
Tlang.SetRequestHeader "Ocp-Apim-Subscription-Key", zKey 'authentication Required
Tlang.SetRequestHeader "Content-type", "Application/json" 'Content-type Required
Tlang.Send zTTxt 'format = [{"text":"Bonjour utilisateur"}]
Tlang.WaitForResponse 'the response takes 1+ seconds needs wait or delay command or results will fail as response has not returned data yet
'Debug.Print Tlang.GetAllResponseHeaders
startpl = 28 'if you use auto languae detect you will need to adjust this number to "69" or greater
endpl = InStr(startpl, Tlang.ResponseText, """") '[{"translations":[{"text":"Hello user","to":"en"}]}]
TranslatorTextAPI = Mid(Tlang.ResponseText, startpl, endpl - startpl) 'Parse out translated text
Tlang.Abort
Else
TranslatorTextAPI = sText 'if blank do nothing return the blank value
End If
End Function
5 年来,我一直使用此代码在 Excel VBA 宏中将用户输入的英语文本转换为法语或德语。那是在 Microsoft Azure Marketplace 上,由于我的使用量很少,所以它是免费的。
Function MicrosoftTranslate(sText As String, Optional sLanguageFrom As String = "", Optional sLanguageTo As String = "en") As String
Dim sRequest As String, sResponseText As String
sRequest = "Translate?from=" & sLanguageFrom & "&to=" & sLanguageTo & "&text=" & sText
sResponseText = MSHttpRequest(sRequest)
'Debug.Print sResponseText
MicrosoftTranslate = StringFromXML(sResponseText)
End Function
Function MicrosoftTranslatorDetect(sText As String) As String
' returns lowercase two character code eg "fr"
MicrosoftTranslatorDetect = StringFromXML(MSHttpRequest("Detect?text=" & sText))
End Function
Function MSHttpRequest(sRequest As String) As String
Dim sURL As String, oH As Object, sToken As String
sURL = "http://api.microsofttranslator.com/V2/Http.svc/" & sRequest
sToken = GetAccessToken()
Set oH = CreateObject("MSXML2.XMLHTTP")
oH.Open "GET", sURL, False
oH.setRequestHeader "Authorization", "Bearer " & sToken
oH.send
MSHttpRequest = oH.responseText
Set oH = Nothing
End Function
Function GetAccessToken() As String
Static sAccess_Token As String, dtExpiry_Time As Date
Const OAUTH_URI As String = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"
'get Your Client ID and client secret from
'https://datamarket.azure.com/developer/applications
Const CLIENT_ID As String = "xxxxxxxxx"
Const CLIENT_SECRET As String = "1234567890abcdefghijklmnopqrstuvwxyz"
Dim sRequest As String, sResponse As String
Dim webRequest As Object
If Now() > dtExpiry_Time Then ' time for a new access token
Set webRequest = CreateObject("MSXML2.XMLHTTP")
sRequest = "grant_type=client_credentials" & _
"&client_id=" & CLIENT_ID & _
"&client_secret=" & URLEncode(CLIENT_SECRET) & _
"&scope=http://api.microsofttranslator.com"
webRequest.Open "POST", OAUTH_URI, False
webRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
webRequest.send (sRequest)
sResponse = webRequest.responseText
Set webRequest = Nothing
If InStr(1, sResponse, """error:""", vbTextCompare) > 0 Then
Err.Raise 9999, "GetAccessToken " & sResponse
End If
sAccess_Token = NameValue("access_token", sResponse)
dtExpiry_Time = Now() + Val(NameValue("expires_in", sResponse)) / 60 / 60 / 24 ' maybe *.95 for safety margin
'Debug.Print "Token expires at "; Format$(dtExpiry_Time, "hh:mm:ss")
End If
GetAccessToken = sAccess_Token
End Function
现在有了新的 Microsoft Azure,我的搭便车似乎结束了。所以现在我需要转换我的 VBA 代码。我看了看,但还没有找到一个很好的参考资料来帮助转换附加的例程。我在 VBA 方面还不错,但需要帮助才能实现这些新功能。
谁能帮助我或指出一些参考资料(对于像我这样的新手),这将使我能够使用新系统。
得到东西后运行我可以决定这个小应用程序是否值得我花钱。
谢谢.....RDK
实际上,Azure Coginitve 服务中的转换器 API 从免费套餐开始。 https://www.microsoft.com/cognitive-services/en-us/pricing
新API的主要区别在于获取令牌的方式。 http://docs.microsofttranslator.com/oauth-token.html
其他的我觉得也是一样的。你可以在这里找到参考: docs.microsofttranslator.com/text-translate.html
我在 Access 中使用此代码翻译单行文本 VBA
中的翻译器代码Function TranslatorTextAPI(sText As String)
'Single step translation code
'for Key info if authentication is failing goto https://portal.azure.com/ log in and refresh keys and update Key information below
'if you cannot find keys you can create new azure account goto link below it is a free service for less then 2 million words
'https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
If Len(sText) > 0 Then 'if blank do nothing return the blank value
Dim sHost As String
Dim zTTxt As String
Dim zKey As String
Dim startpl, endpl As Integer
zKey = "subscriptionKey" 'authentication Key from subscription
sHost = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0" 'required link for authentication
sHost = sHost & "&from=fr&to=en" 'determine language from and langauge to
zTTxt = "[{""text"":" & """" & sText & """}]" 'JSON format spcific requirement [{"text":"value"}] max 5000 characters
Dim Tlang As Object
Set Tlang = CreateObject("WinHttp.WinHttpRequest.5.1") 'need to add reference libary "Microsft WinHTTP Service,Version 5.1"
Tlang.Open "POST", sHost, False 'open connection to "Translator Text API" POST command required
Tlang.SetRequestHeader "Ocp-Apim-Subscription-Key", zKey 'authentication Required
Tlang.SetRequestHeader "Content-type", "Application/json" 'Content-type Required
Tlang.Send zTTxt 'format = [{"text":"Bonjour utilisateur"}]
Tlang.WaitForResponse 'the response takes 1+ seconds needs wait or delay command or results will fail as response has not returned data yet
'Debug.Print Tlang.GetAllResponseHeaders
startpl = 28 'if you use auto languae detect you will need to adjust this number to "69" or greater
endpl = InStr(startpl, Tlang.ResponseText, """") '[{"translations":[{"text":"Hello user","to":"en"}]}]
TranslatorTextAPI = Mid(Tlang.ResponseText, startpl, endpl - startpl) 'Parse out translated text
Tlang.Abort
Else
TranslatorTextAPI = sText 'if blank do nothing return the blank value
End If
End Function