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
+