diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..cd6491769f810eccf8765c89cc1bae2328f75d3d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +translateit diff --git a/go.mod b/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..e1854cff87430fd6d83ef37e5cef6cf7f6e3a54a --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module gitlab.schukai.com/oss/utilities/neovim/translateit + +go 1.21.6 + +require github.com/neovim/go-client v1.2.1 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..c2c1b6447dcb0453800d6fa83635a772f1cd03ae --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/neovim/go-client v1.2.1 h1:kl3PgYgbnBfvaIoGYi3ojyXH0ouY6dJY/rYUCssZKqI= +github.com/neovim/go-client v1.2.1/go.mod h1:EeqCP3z1vJd70JTaH/KXz9RMZ/nIgEFveX83hYnh/7c= diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..1588fa7bbe7b263c81fefa81b2f2db5850e6260f Binary files /dev/null and b/main differ diff --git a/main.go b/main.go new file mode 100644 index 0000000000000000000000000000000000000000..4a5244987e43ee851443568acb69909ab44c643b --- /dev/null +++ b/main.go @@ -0,0 +1,112 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "os" + "os/exec" + "strings" +) + +func GetAPIKey(filename string) (string, error) { + cmd := exec.Command("pass", filename) + + output, err := cmd.Output() + if err != nil { + return "", err + } + + // Entfernen Sie das Lineending (\n), falls es existiert + apiKey := strings.TrimSpace(string(output)) + return apiKey, nil +} + +type TranslationRequest struct { + Text []string `json:"text"` + TargetLang string `json:"target_lang"` +} + +type TranslationResponse struct { + Translations []struct { + DetectedSourceLanguage string `json:"detected_source_language"` + Text string `json:"text"` + } `json:"translations"` +} + +func TranslateText(inputText, targetLang, authKey string) (string, error) { + reqBody := &TranslationRequest{ + Text: []string{inputText}, + TargetLang: targetLang, + } + + reqBodyBytes, err := json.Marshal(reqBody) + if err != nil { + return "", err + } + + req, err := http.NewRequest("POST", "https://api.deepl.com/v2/translate", bytes.NewReader(reqBodyBytes)) + if err != nil { + return "", err + } + + req.Header.Set("Authorization", "DeepL-Auth-Key "+authKey) + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("unexpected status: %v", resp.Status) + } + + respBodyBytes, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + var respBody TranslationResponse + if err := json.Unmarshal(respBodyBytes, &respBody); err != nil { + return "", err + } + + if len(respBody.Translations) == 0 { + return "", fmt.Errorf("no translations received") + } + + return respBody.Translations[0].Text, nil +} + +func transalte(text string) string { + filename := "schukai/deepl-api-key" + apiKey, err := GetAPIKey(filename) + if err != nil { + return text + " (" + err.Error() + ")" + } + + authKey := apiKey + sourceText := text + targetLang := "EN" + translatedText, err := TranslateText(sourceText, targetLang, authKey) + if err != nil { + return text + " (" + err.Error() + ")" + } + + return translatedText +} + +func main() { + args := os.Args + if len(args) < 2 { + fmt.Println("Please provide an argument") + return + } + originalText := os.Args[1] + //log.Println(originalText) + fmt.Println(transalte(originalText)) +} diff --git a/translateit.vim b/translateit.vim new file mode 100644 index 0000000000000000000000000000000000000000..ec5513cdd6aa4ffc678c3f429a55bdbfdfbf7f95 --- /dev/null +++ b/translateit.vim @@ -0,0 +1,22 @@ +function! TranslateSelectedText() + let selection_mode = visualmode() + + let l:translated_text = "" + + if selection_mode == 'v' || selection_mode == 'V' + " zeichen- oder linienweise Auswahl + let l:current_text = getreg('"') + let l:translated_text = system(g:translateit_path . '/translateit ' . shellescape(l:current_text, 1)) + elseif selection_mode == "\<C-V>" + " blockweise Auswahl + let l:current_text = getreg("x") + let l:translated_text = system(g:translateit_path . '/translateit ' . shellescape(l:current_text, 1)) + end + + if l:translated_text != "" + normal! gv + normal! c + execute 'normal! a' . l:translated_text + endif +endfunction +