Deepl.com - Automatisierte Übersetzung (Windows)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von RSBasic »

Guten Morgen,

ich bin mit Deepl.com sehr zufrieden.
Meine WinAPI Library wird in vier Sprachen angeboten und die Texte wurden mit Google Translator automatisiert übersetzt. Aufgrund der vielen Beispielcodes (1138 Codes) ist das manuelle Übersetzen sehr zeitaufwendig.
Da ich Deepl.com sehr gut finde, würde ich die Texte mit Deepl.com erneut übersetzen lassen.
Um das Übersetzen automatisieren zu können, brauche ich eine Schnittstelle (HTTP-Request oder JSON-API), damit ich die Texte nicht einzeln manuell einfügen muss.

Auf der folgenden Seite gibt es eine Lösung mit PowerShell, um die Texte per JSON an die Website zu senden: https://psvmware.wordpress.com/2017/09/ ... owershell/

Den Code der Funktion kann man in einer PowerShell-Datei (*.ps1) speichern und diese mit der CMD-Konsole aufrufen.
Ich habe den Code leicht modifiziert, damit man Parameter an die Funktion übergeben kann (Man kann es bestimmt besser lösen, aber so gut bin ich noch nicht in PowerShell.):

Code: Alles auswählen

function get-DeepLtranslation ($sentence, $fromLang, $toLang)
{
#Languages available: PL,EN,NL,ES,IT,FR
$url = "https://www.deepl.com/jsonrpc"
$call = '{"jsonrpc":"2.0","method":"LMT_handle_jobs","params":{"jobs":[{"kind":"default","raw_en_sentence":"'+$sentence+'"}],"lang":{"user_preferred_langs":["EN","PL","NL"],"source_lang_user_selected":"'+$fromLang+'","target_lang":"'+$toLang+'"},"priority":-1},"id":15}'
$bytes = [System.Text.Encoding]::ASCII.GetBytes($call)
$web = [System.Net.WebRequest]::Create($url)
$web.Method = "POST"
$web.ContentLength = $bytes.Length
$web.ContentType = "application/x-www-form-urlencoded"
$stream = $web.GetRequestStream()
$stream.Write($bytes,0,$bytes.Length)
$stream.close()
$reader = New-Object System.IO.Streamreader -ArgumentList $web.GetResponse().GetResponseStream()
$answer = ($reader.ReadToEnd()|ConvertFrom-Json).result.translations.beams | select -ExpandProperty 'postprocessed_sentence'
$reader.Close()
return $answer
}
get-DeepLtranslation -sentence $args[0] -fromLang $args[1] -toLang $args[2]
Und jetzt der PB-Code zum Aufrufen dieser ps1-Datei zum Übersetzen:

Code: Alles auswählen

EnableExplicit

Define Program

Define PSFile$ = "C:\...\File.ps1"
Define Sentence$ = "Hallo Welt"
Define FromLang$ = "DE"
Define ToLang$ = "EN"

Program = RunProgram("cmd.exe", "/c PowerShell.exe -Command " + Chr(34) + PSFile$ + Chr(34) + " '" + Sentence$ + "' '" + FromLang$ + "' '" + ToLang$ + "'", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
If Program
  While ProgramRunning(Program)
    If AvailableProgramOutput(Program)
      Debug ReadProgramString(Program)
      ;Break;Falls man nur die erste Zeile auslesen möchte
    EndIf
  Wend
  
  CloseProgram(Program)
EndIf
Ich hoffe, es ist für euch nützlich. Den Code könnt ihr gerne verbessern und hier posten.

\\Edit:
Man könnte es wahrscheinlich auch komplett in PB machen, aber das fiel mir erst später ein und bin jetzt zu faul dafür, den Code nach PB zu übersetzen. Aber wenn jemand einen kompletten PB-Code schreiben möchte, dann wäre der Code noch besser.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung

Beitrag von NicTheQuick »

Könnte man mit ReceiveHTTPMemory() auch POST-Request senden, wäre das ein Kinderspiel. Aber bei Purebasic wird ja leider viel zu häufig alles nur halbherzig implementiert. Weil es dann auch noch HTTPS ist, kann man es nicht mal mit der normalen Network-Library simulieren.

Man bräuchte also eine externe Librarie dafür, wodurch Plattformkompatibilität wiederum schwierig wird. Aber Powershell ist ja auch nicht plattformunabhängig. Aber bestimmt hat hier jemand trotzdem Lust das zu machen, so wie ich unsere User hier kenne. :-D
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Deepl.com - Automatisierte Übersetzung

Beitrag von Kiffi »

NicTheQuick hat geschrieben:Aber bestimmt hat hier jemand trotzdem Lust das zu machen, so wie ich unsere User hier kenne. :-D
ehrlich gesagt habe ich vor ein paar Tagen auch so was ähnliches wie Ray gebastelt. Als mir dann klar wurde, dass es dann via HTTPS Post gesendet werden muss (und welchen Aufwand das in PB bedeutet), habe ich ganz schnell die Finger davon gelassen.

Grüße ... Peter
Hygge
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung

Beitrag von TroaX »

NicTheQuick hat geschrieben:Aber Powershell ist ja auch nicht plattformunabhängig. Aber bestimmt hat hier jemand trotzdem Lust das zu machen, so wie ich unsere User hier kenne. :-D
Normalerweise bin ich bei HTTP/S-Sauereien gerne dabei. Aber nicht mit PureBasic. Man könnte es ja mit LibCURL machen. Aber wenn der Include mit einer neueren Version von PB nicht mehr läuft bzw. das Include mit einer neueren Version von cURL inkompatibel ist, dann ist das Gebastel wieder groß. Und darauf habe ich kein Nerv.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von HeX0R »

Irgendwie wollen die Umlaute nicht?!

Code: Alles auswählen

EnableExplicit

Define Program

Define PSFile$ = "...\deepl.ps1"
Define Sentence$ = "Pretty World"
Define FromLang$ = "EN"
Define ToLang$ = "DE"
Define a$

Debug Sentence$
Program = RunProgram("cmd.exe", "/c PowerShell.exe -Command " + Chr(34) + PSFile$ + Chr(34) + " '" + Sentence$ + "' '" + FromLang$ + "' '" + ToLang$ + "'", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
If Program
  While ProgramRunning(Program)
    If AvailableProgramOutput(Program)
    	a$ = ReadProgramString(Program)
    	Debug a$
      ;Break;Falls man nur die erste Zeile auslesen möchte
    EndIf
  Wend
 
  CloseProgram(Program)
EndIf
Oder geht das bei Dir?
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von RSBasic »

Bei mir auch nicht. Ich habs mit verschiedenen Zeichensätzen (sowohl in der ps1-Datei bei System.Text.Encoding, als auch bei RunProgram() und ReadProgramString()) ausprobiert, aber irgendwie komme ich gerade nicht auf die Lösung.
Vielleicht hat jemand von euch eine Lösung?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von HeX0R »

Das liegt auf jeden Fall an dem ConvertFrom-Json, der Server schickt das als \u00fc (für ü), aber dieses powershell bekommt das nicht umgewandelt und macht ein FFFD (also einen REPLACEMENT CHARACTER) draus.
Das bekommst Du hinterher natürlich nicht mehr zurückentschlüsselt.

Und ich kenne mich mit dem furchtbaren powershell scripting Mist nicht aus.

Habe es jetzt ein wenig umständlich gelöst (wofür haben wir denn JSON features in PB), aber Funktion ist bekanntlich alles :)
deepl.ps1:

Code: Alles auswählen

function get-DeepLtranslation ($sentence, $fromLang, $toLang)
{
#Languages available: PL,EN,NL,ES,IT,FR
$url = "https://www.deepl.com/jsonrpc"
$call = '{"jsonrpc":"2.0","method":"LMT_handle_jobs","params":{"jobs":[{"kind":"default","raw_en_sentence":"'+$sentence+'"}],"lang":{"user_preferred_langs":["EN","PL","NL"],"source_lang_user_selected":"'+$fromLang+'","target_lang":"'+$toLang+'"},"priority":-1},"id":15}'
$bytes = [System.Text.Encoding]::UTF8.GetBytes($call)
$web = [System.Net.WebRequest]::Create($url)
$web.Method = "POST"
$web.ContentLength = $bytes.Length
$web.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
$stream = $web.GetRequestStream()
$stream.Write($bytes,0,$bytes.Length)
$stream.close()
$reader = New-Object System.IO.Streamreader -ArgumentList $web.GetResponse().GetResponseStream()
$answer = $reader.ReadToEnd()
$reader.Close()
return $answer
}
get-DeepLtranslation -sentence $args[0] -fromLang $args[1] -toLang $args[2]
PB-Code:

Code: Alles auswählen

Structure _JSON_OBJ4_
	num_symbols.i
	totalLogProb.i
	score.i
	postprocessed_sentence.s
EndStructure

Structure _JSON_OBJ3_
	timeAfterPreprocessing.i
	timeReceivedFromEndpoint.i
	List beams._JSON_OBJ4_()
	total_time_endpoint.i
	timeSentToEndpoint.i
EndStructure

Structure _JSON_OBJ2_
	source_lang.s
	target_lang.s
	List translations._JSON_OBJ3_()
	ource_lang_is_confident.i
EndStructure

Structure _JSON_OBJ_
	jsonrpc.s
	id.i
	result._JSON_OBJ2_
EndStructure

Procedure.s Translate(Sentence$, FromLang$, ToLang$)
	Protected Program, s.s, Result.s, NumCR
	Protected PSFile$   = "...deepl.ps1"
	Protected R._JSON_OBJ_
	
	Sentence$ = ReplaceString(Sentence$, "\n", #ESC$)
	
	Program = RunProgram("cmd.exe", "/c PowerShell.exe -Command " + Chr(34) + PSFile$ + Chr(34) + " '" + Sentence$ + "' '" + FromLang$ + "' '" + ToLang$ + "'", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
	If Program
		While ProgramRunning(Program)
			If AvailableProgramOutput(Program)
				s = ReadProgramString(Program)
				If ParseJSON(0, s)
					ExtractJSONStructure(JSONValue(0), @R, _JSON_OBJ_)
					If FirstElement(R\result\translations()) And FirstElement(R\result\translations()\beams())
						Result = R\result\translations()\beams()\postprocessed_sentence
					EndIf
				EndIf
				Break
			EndIf
		Wend
		CloseProgram(Program)
	EndIf
	
	Result = ReplaceString(Result, #ESC$, "\n")

	
	ProcedureReturn Result
EndProcedure

Debug Translate("pretty world", "EN", "DE")
Brauchst Du mehr Ergebnisse, einfach durch R\result\translations()\beams() iterieren.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von HeX0R »

Hier noch ein Beispiel mit curl (command line, habs von hier ), dann muss man dieses hässliche Powershell Ding nicht mehr nehmen.

curl.exe sollte im gleichen Verzeichnis liegen, dann wird alles gut :)

Code: Alles auswählen

Structure _JSON_OBJ4_
   num_symbols.i
   totalLogProb.i
   score.i
   postprocessed_sentence.s
EndStructure

Structure _JSON_OBJ3_
   timeAfterPreprocessing.i
   timeReceivedFromEndpoint.i
   List beams._JSON_OBJ4_()
   total_time_endpoint.i
   timeSentToEndpoint.i
EndStructure

Structure _JSON_OBJ2_
   source_lang.s
   target_lang.s
   List translations._JSON_OBJ3_()
   ource_lang_is_confident.i
EndStructure

Structure _JSON_OBJ_
   jsonrpc.s
   id.i
   result._JSON_OBJ2_
EndStructure

Procedure.s Translate(Sentence$, FromLang$, ToLang$)
   Protected Program, s.s, Result.s, NumCR
   Protected CurlOptions.s, Curl$ = "curl.exe"
   Protected R._JSON_OBJ_
   
   Sentence$   = ReplaceString(Sentence$, "\n", #ESC$)
   
   CurlOptions = "-X POST --insecure -d " + #DQUOTE$ + "{\" + #DQUOTE$ + "jsonrpc\" + #DQUOTE$ + ":\" + #DQUOTE$ + "2.0\" + #DQUOTE$ + ",\" + #DQUOTE$ + 
                 "method\" + #DQUOTE$ + ":\" + #DQUOTE$ + "LMT_handle_jobs\" + #DQUOTE$ + ",\" + #DQUOTE$ + "params\" + #DQUOTE$ + ":{\" + #DQUOTE$ +
                 "jobs\" + #DQUOTE$ + ":[{\" + #DQUOTE$ + "kind\" + #DQUOTE$ + ":\" + #DQUOTE$ + "default\" + #DQUOTE$ + ",\" + #DQUOTE$ + "raw_en_sentence\" + #DQUOTE$ +
                 ":\" + #DQUOTE$ + Sentence$ + "\" + #DQUOTE$ + "}],\" + #DQUOTE$ + "lang\" + #DQUOTE$ + ":{\" + #DQUOTE$ + "user_preferred_langs\" + #DQUOTE$ + 
                 ":[\" + #DQUOTE$ + "EN\" + #DQUOTE$ + ",\" + #DQUOTE$ + "DE\" + #DQUOTE$ + ",\" + #DQUOTE$ + "FR\" + #DQUOTE$ + "]" +
                 ",\" + #DQUOTE$ + "source_lang_user_selected\" + #DQUOTE$ + ":\" + #DQUOTE$ + FromLang$ + "\" + #DQUOTE$ + ",\" + #DQUOTE$ + "target_lang\" + #DQUOTE$ + 
                 ":\" + #DQUOTE$ + ToLang$ + "\" + #DQUOTE$ + "},\" + #DQUOTE$ + "priority\" + #DQUOTE$ + ":-1},\" + #DQUOTE$ + "id\" + #DQUOTE$ + ":15}" + #DQUOTE$ + " "
   CurlOptions + "https://www.deepl.com/jsonrpc"
   Program = RunProgram(GetPathPart(ProgramFilename()) + Curl$, CurlOptions, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

   If Program
      While ProgramRunning(Program)
         If AvailableProgramOutput(Program)
            s = ReadProgramString(Program)
            If ParseJSON(0, s)
               ExtractJSONStructure(JSONValue(0), @R, _JSON_OBJ_)
               If FirstElement(R\result\translations()) And FirstElement(R\result\translations()\beams())
                  Result = R\result\translations()\beams()\postprocessed_sentence
               EndIf
            EndIf
            Break
         EndIf
      Wend
      CloseProgram(Program)
   EndIf
   
   Result = ReplaceString(Result, #ESC$, "\n")

   
   ProcedureReturn Result
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
	Debug Translate("pretty world", "EN", "DE")
CompilerEndIf
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von RSBasic »

Danke HeX0R für die Lösung und für den Zusatzcode mit curl. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Deepl.com - Automatisierte Übersetzung (Windows)

Beitrag von tft »

Hallo,

ich würde auch gerne sagen COOLLL ... aber bei mir läufts nicht. Muss ich noch etwas installieren?

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Antworten