Skip to content

Instantly share code, notes, and snippets.

@masatoi
Last active September 8, 2023 15:47
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save masatoi/ec90d49331e40983427025f8167d01ee to your computer and use it in GitHub Desktop.
Save masatoi/ec90d49331e40983427025f8167d01ee to your computer and use it in GitHub Desktop.
emacs deepl client
;;; Install
;; requestが必要なので M-x package-install request などでインストールしておく
;; init.elなどでロードする
;; (load-file "/path/to/deepl.el")
;; キーバインドを設定しておく
;; (global-set-key (kbd "C-c t") 'deepl-translate)
;;; Usage
;; 翻訳したい部分をリージョン選択して設定したキーバインド、または M-x deepl-translate
;; 翻訳結果がミニバッファに出る。また、同じ内容がクリップボードにコピーされている
(require 'request)
(defvar deepl-auth-key) ; この変数にdeeplから発行されるキーを設定する
(defvar deepl-confirmation-threshold 3000)
(defvar deepl-endpoint "api.deepl.com") ; 無料版は api-free.deepl.com
(cl-defun confirm-send-long-string (&key retry)
(let ((send-it-p
(read-from-minibuffer
(if retry
"Please answer with \"yes\" or \"no\". [yes/no]: "
(format "It's over %S characters, do you really want to send it? [yes/no]: "
deepl-confirmation-threshold)))))
(cond ((equal send-it-p "yes") t)
((equal send-it-p "no") nil)
(t (confirm-send-long-string :retry t)))))
(cl-defun deepl-translate-internal (text source-lang target-lang success-callback)
(when (and (> (length text) deepl-confirmation-threshold)
(not (confirm-send-long-string)))
(cl-return-from deepl-translate-internal))
(request (format "https://%s/v2/translate" deepl-endpoint)
:type "POST"
:data `(("auth_key" . ,deepl-auth-key)
("text" . ,text)
("source_lang" . ,source-lang)
("target_lang" . ,target-lang))
:parser 'json-read
:success success-callback))
(cl-defun deepl--output-to-messages (&key data &allow-other-keys)
(let ((translated-text (cdr (assoc 'text (aref (cdr (assoc 'translations data)) 0)))))
(kill-new translated-text)
(message translated-text)))
(defun deepl-ej (start end)
(interactive "r")
(let ((region (buffer-substring start end)))
(deepl-translate-internal region "EN" "JA" #'deepl--output-to-messages)))
(defun deepl-je (start end)
(interactive "r")
(let ((region (buffer-substring start end)))
(deepl-translate-internal region "JA" "EN" #'deepl--output-to-messages)))
(defun ja-char-p (char)
(or (<= #x3041 char #x309f) ; hiragana
(<= #x30a1 char #x30ff) ; katakana
(<= #x4e01 char #x9faf) ; kanji
))
(defun ja-string-p (str)
(>= (cl-count-if #'ja-char-p str) 3))
(defun deepl-translate (start end)
(interactive "r")
(let ((region (buffer-substring start end)))
(if (ja-string-p region)
(deepl-translate-internal region "JA" "EN" #'deepl--output-to-messages)
(deepl-translate-internal region "EN" "JA" #'deepl--output-to-messages))))
@masatoi
Copy link
Author

masatoi commented Jan 16, 2021

  • 翻訳結果をmessageとして出す他にkill ringに突っ込むようにした。
  • 文字数に応じてお金がかかるため、長すぎる入力は確認を取るようにした
  • regionに日本語文字(ひらがな、カタカナ、漢字)を3字以上含んでいるときには日英翻訳、そうでないときは英日翻訳するようにした

@hirose31
Copy link

hirose31 commented Feb 1, 2022

DeepL API Free だと https://api-free.deepl.com/v2/translate なので変更できるようにしてみました。

--- deepl.el.orig       2022-02-01 20:54:31.103199131 +0900
+++ deepl.el    2022-02-01 21:16:25.836504027 +0900
@@ -13,6 +13,7 @@

 (defvar deepl-auth-key) ; この変数にdeeplから発行されるキーを設定する
 (defvar deepl-confirmation-threshold 3000)
+(defvar deepl-endpoint "api.deepl.com")

 (cl-defun confirm-send-long-string (&key retry)
   (let ((send-it-p
@@ -30,7 +31,7 @@
              (not (confirm-send-long-string)))
     (cl-return-from deepl-translate-internal))

-  (request "https://api.deepl.com/v2/translate"
+  (request (format "https://%s/v2/translate" deepl-endpoint)
     :type "POST"
     :data `(("auth_key" . ,deepl-auth-key)
             ("text" . ,text)

@masatoi
Copy link
Author

masatoi commented Jun 21, 2022

ありがとうございます。反映しました

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment