Trong Posted January 16, 2023 Share Posted January 16, 2023 (edited) Get Subscription Key/Region step: https://portal.azure.com/#home => Translator => Your Instance Name => Endpoints: Click here to view endpoints Standalone script: expandcollapse popup;#include <String.au3> ;#include <File.au3> Opt("MustDeclareVars", 1) ;0=no, 1=require pre-declaration Global $oErrorHandler = ObjEvent("AutoIt.Error", "__COMErrFunc") ; ============================================================================================================================ ; Require Microsoft Azure Account and Bing Translator Text API Subscription Key ; GET KEY: https://portal.azure.com/#home => Translator => Your Instance Name => Endpoints: Click here to view endpoints Global $sSubscription_Key = '' ;| ENTER YOUR Key 1 HERE ;~ Global $sSubscription_Key_2 = '' ;| ENTER YOUR Key 2 HERE Global $sSubscription_Region = 'eastasia' ; 'global'| ENTER YOUR Subscription Region HERE Global $sSubscription_Region_URL = "https://api.cognitive.microsofttranslator.com/" ; Define the source and target languages Global $slang_From = '' ; "vi" Global $slang_TO = "en" ;Eg 1 Global $vi_Text = "Tôi Yêu Bạn" Global $Text_Translated = _Bing_TranslateText($vi_Text, $slang_From, $slang_TO) ;~ MsgBox(0, 'Bing Translate', "Translate from " & $slang_From & "= " & $vi_Text & @CRLF & "Translated to " & $slang_TO & "= " & $Text_Translated) ; End eg 1 ! ConsoleWrite('! ' & $Text_Translated & @CRLF) ;Eg 2 ; Specify the folder containing the text files ;~ Global $sWorkingDir = @ScriptDir & "\TEST" ;~ Global $sFileTranslated_Prefix = '_translated' ;~ Global $Retun = _Translate_All_TxtFileInDir($sWorkingDir, '*', $slang_From, $slang_TO) ;~ If $Retun Then ;~ If FileExists($sWorkingDir & "\*" & $sFileTranslated_Prefix & ".txt") Then ;~ ; Notify the user that the translation is complete ;~ MsgBox(0, "Translation Complete", "All files in the folder " & $sWorkingDir & @CRLF & "have been translated and saved with the prefix " & $sFileTranslated_Prefix) ;~ Else ;~ MsgBox(48, "Error /!\", "No files translated in the folder: " & $sWorkingDir) ;~ EndIf ;~ Else ;~ MsgBox(16, "Error /!\", "No files in the folder: " & $sWorkingDir) ;~ EndIf ; End eg 2 ! ; ============================================================================================================================ ; Function: Func _Translate_All_TxtFileInDir($sFilePath, $sFilter = "*", $slang_From = 'Auto', $slang_TO = "en", $sFileTranslated_Prefix = '_translated') If Not FileExists($sFilePath) Then Return SetError(1, 0, 0) ; Get an array of all the files in the folder If ($sFilter == "*.*") Or ($sFilter == Default) Or ($sFilter == '') Then $sFilter = "*" $sFilter = $sFilter & ".txt" Local $aListFile, $aFileList = _FileListToArray($sFilePath, $sFilter, 1, 1) If Not IsArray($aFileList) Then Return SetError(1, 0, 0) For $i = 1 To UBound($aFileList) - 1 If Not StringInStr($aFileList[$i], $sFileTranslated_Prefix) Then $aListFile &= '|' & $aFileList[$i] Next $aFileList = StringSplit($aListFile, '|', 2) Local $sFileContent, $translated_text, $hOpen, $sFilePath_translated ; Loop through the array of files For $i = 1 To UBound($aFileList) - 1 ; Read the text file ConsoleWrite("- Reading the file " & $i & ":" & $aFileList[$i] & @CRLF) $sFileContent = FileRead($aFileList[$i]) If (@error) Then ConsoleWrite("An error occurred while reading the text file:" & $aFileList[$i] & @CRLF) ;MsgBox(16, "Error", "An error occurred while reading the text file:" & $aFileList[$i]) ContinueLoop EndIf ; Translate the text ConsoleWrite("- Start translating..." & @CRLF) $translated_text = _Bing_TranslateText($sFileContent, $slang_From, $slang_TO) If (@error) Then ConsoleWrite("! Error: An error occurred while translate text !" & @CRLF) ;MsgBox(16, "Error", "An error occurred while translate text !") ContinueLoop EndIf ; Write the translated text to a new file $sFilePath_translated = StringReplace($aFileList[$i], ".txt", $sFileTranslated_Prefix & ".txt") ConsoleWrite("- Writing the translated text to the file:" & $sFilePath_translated & @CRLF) $hOpen = FileOpen($sFilePath_translated, 2 + 8 + 128) FileWrite($hOpen, $translated_text) If (@error) Then FileClose($hOpen) ConsoleWrite("! Error: An error occurred while writing the translated text to the file:" & $sFilePath_translated & @CRLF) ;MsgBox(16, "Error", "An error occurred while writing the translated text to the file:" & $sFilePath_translated) ContinueLoop EndIf FileClose($hOpen) ConsoleWrite("+ " & $i & " OK !" & @CRLF) $sFileContent = '' $translated_text = '' $sFilePath_translated = '' $hOpen = 0 Next Return 1 EndFunc ;==>_Translate_All_TxtFileInDir ; Function to translate text using Bing Translator API Func _Bing_TranslateText($sContent, $slang_From = 'Auto', $slang_TO = "en") Local $iSubscriptionKey = StringLower(StringStripWS($sSubscription_Key, 8)) If ($iSubscriptionKey == '') Then Exit MsgBox(16, 'Error /!\', "Ocp-Apim-Subscription-Key is Not Enter !") ;Return SetError(1, 0, '') EndIf Local $iSubscriptionRegion = StringLower(StringStripWS($sSubscription_Region, 8)) If ($iSubscriptionRegion == '') Then $iSubscriptionRegion = 'global' If ($iSubscriptionRegion == '') Then Exit MsgBox(16, 'Error /!\', "Ocp-Apim-Subscription-Region is Not Enter !") ;Return SetError(1, 0, '') EndIf Local $iSubscription_RegionURL = StringStripWS($sSubscription_Region_URL, 8) If StringRight($iSubscription_RegionURL, 1) == '/' Then $iSubscription_RegionURL = StringTrimRight($iSubscription_RegionURL, 1) If ($iSubscription_RegionURL == '') Then Exit MsgBox(16, 'Error /!\', "Region URL is Not Enter !") ;Return SetError(1, 0, '') EndIf $slang_From = StringStripWS($slang_From, 8) $slang_TO = StringStripWS($slang_TO, 8) If ($slang_From == '') Then $slang_From = 'Auto' ConsoleWrite("> Translate from language: " & $slang_From & ' [TO> ' & $slang_TO & @CRLF) ConsoleWrite("> //-------------------------- Text:" & @CRLF & $sContent & @CRLF) ConsoleWrite("---------------------------------- \\" & @CRLF) $slang_From = StringLower($slang_From) $slang_TO = StringLower($slang_TO) If ($slang_From == 'auto') Then $slang_From = '' Local $apiURL = $sSubscription_Region_URL & "/translate?api-version=3.0&from=" & $slang_From & "&to=" & $slang_TO Local $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1") $oHTTP.Open("POST", $apiURL) $oHTTP.SetRequestHeader("Content-Type", "application/json; charset=UTF-8") $oHTTP.SetRequestHeader("Ocp-Apim-Subscription-Key", $iSubscriptionKey) If ($iSubscriptionRegion <> 'global') Then $oHTTP.SetRequestHeader("Ocp-Apim-Subscription-Region", $iSubscriptionRegion) $oHTTP.Send('[{"Text": "' & $sContent & '"}]') If $oHTTP.Status <> 200 Then ConsoleWrite("! Error: An error occurred while connecting to the Bing Translator API. HTTP status code: " & $oHTTP.Status & " " & $oHTTP.StatusText & @CRLF) ;MsgBox(16, "Error", "An error occurred while connecting to the Bing Translator API. HTTP status code: " & $oHTTP.Status & " " & $oHTTP.StatusText) Return SetError(2, 0, "") EndIf Local $Json_Response = $oHTTP.ResponseText ConsoleWrite("> Microsoft Translator Response: " & $Json_Response & @CRLF) Local $aTranslated = _StringBetween($Json_Response, '"translations":[{"text":"', '","to":"' & $slang_TO & '"}]}') If @error Or (Not IsArray($aTranslated)) Then ConsoleWrite("! Error: An error occurred while decoding the JSON response from the Bing Translator API." & @CRLF) ;MsgBox(16, "Error", "An error occurred while decoding the JSON response from the Bing Translator API.") Return SetError(2, 0, "") EndIf Local $sContent_Translated = $aTranslated[0] $sContent_Translated = StringReplace($sContent_Translated, '\r\n', @CRLF) ConsoleWrite(">//---------------- Translated text :" & @CRLF & $sContent_Translated & @CRLF) ConsoleWrite("---------------------------------- //" & @CRLF) Return SetError(0, 0, $sContent_Translated) EndFunc ;==>_Bing_TranslateText Func __COMErrFunc() ;Keep Script Runing on Obj Error! EndFunc ;==>__COMErrFunc ; ============================================================================================================================ ; Functions on Include: Func _StringBetween($sString, $sStart, $sEnd, $iMode = 0, $bCase = False) $sStart = $sStart ? "\Q" & $sStart & "\E" : "\A" If $iMode <> 1 Then $iMode = 0 If $iMode = 0 Then $sEnd = $sEnd ? "(?=\Q" & $sEnd & "\E)" : "\z" Else $sEnd = $sEnd ? "\Q" & $sEnd & "\E" : "\z" EndIf If $bCase = Default Then $bCase = False EndIf Local $aRet = StringRegExp($sString, "(?s" & (Not $bCase ? "i" : "") & ")" & $sStart & "(.*?)" & $sEnd, 3) If @error Then Return SetError(1, 0, 0) Return $aRet EndFunc ;==>_StringBetween Func _FileListToArray($sFilePath, $sFilter = "*", $iFlag = 0, $bReturnPath = False) Local $sDelimiter = "|", $sFileList = "", $sFileName = "", $sFullPath = "" $sFilePath = StringRegExpReplace($sFilePath, "[\\/]+$", "") & "\" If $iFlag = Default Then $iFlag = 0 If $bReturnPath Then $sFullPath = $sFilePath If $sFilter = Default Then $sFilter = "*" If Not FileExists($sFilePath) Then Return SetError(1, 0, 0) If StringRegExp($sFilter, "[\\/:><\|]|(?s)^\s*$") Then Return SetError(2, 0, 0) If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 0, 0) Local $hSearch = FileFindFirstFile($sFilePath & $sFilter) If @error Then Return SetError(4, 0, 0) While 1 $sFileName = FileFindNextFile($hSearch) If @error Then ExitLoop If ($iFlag + @extended = 2) Then ContinueLoop $sFileList &= $sDelimiter & $sFullPath & $sFileName WEnd FileClose($hSearch) If $sFileList = "" Then Return SetError(4, 0, 0) Return StringSplit(StringTrimLeft($sFileList, 1), $sDelimiter) EndFunc ;==>_FileListToArray Edited April 12 by Trong make better sungmin0206 1 Regards, Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now