以下の記事では、「selected」という、リージョンで囲われた文字列を対象に様々な関数を1キーストロークで発動できるパッケージの紹介がされている。
同記事では対象の文字列に対してgoogle検索を呼び出す方法も紹介されているが、ここではgoogle翻訳を呼び出すのが目的である。
MELPAよりgoogle-translateというパッケージをインストールした上で、以下の関数を定義する。
(defvar google-translate--english-chars "[:ascii:]’“”–")
(defvar google-translate--target-text "")
(defun google-translate-auto ()
"Automatically recognize and translate Japanese and English."
(interactive)
(cond ((use-region-p)
(setq google-translate--target-text
(replace-regexp-in-string
"\\([^\n]\\)\n\\([^\n]\\)" "\\1 \\2"
(replace-regexp-in-string
"^\s*\\(.*?\\)\s*$" "\\1"
(funcall region-extract-function nil))))
(deactivate-mark)
(when (fboundp 'cua-cancel)
(cua-cancel)))
(t
(setq google-translate--target-text
(read-string "Google Translate: "))))
(if (string-match
(format "\\`[%s]+\\'" google-translate--english-chars)
google-translate--target-text)
(google-translate-translate "en" "ja" google-translate--target-text)
(google-translate-translate "ja" "en" google-translate--target-text)))
この関数のミソは、google翻訳にかける前に「改行」を削除していることである。また日本語と英語を自動判別する機能もついているので、便利に使えるだろう。
そして以下の設定を書く。
(when (require 'selected nil t)
(define-key selected-keymap (kbd "t") #'google-translate-auto)
(selected-global-mode 1))
すると、リージョンに文字列が囲われた状態で、t を押下すればgoogle translateからの翻訳結果が帰ってくる(*Google Translate*バッファ)。