EmacsでMicrosoft Translatorを作ってみた を改良
Emacsで英和辞書や和英辞書をすぐに引けるようにしたい と同じ問題があった。
元のコードでは英語かどうかを判定するのに全文字がascii文字だけかどうかを調べているので、英文にスペイン語やドイツ語などの地名や人名が入っていると日本語と判定される。(El Niño エルニーニョとか)
翻訳範囲の指定方法を増やした。
C-u でパラグラフ
C-u C-u で単語
C-u C-u C-u でキーボードから単語や文を入力
引数なしでセンテンス
リージョンを指定していればそのリージョン
*Microsoft Translator*
バッファをhelp-mode
にしてq
で消せるようにした。
C-M-m
で起動。
(autoload 'microsoft-translator-translate "microsoft-translator" "" t)
(autoload 'microsoft-translator-auto-translate "microsoft-translator" "" t)
(defun microsoft-translator--get-string (arg)
(or (cond ((stringp arg) arg)
((= arg 4) ;C-u
(thing-at-point 'paragraph))
((= arg 16) ;C-u C-u
(thing-at-point 'word))
((= arg 64) ;C-u C-u C-u
(read-string "Microsoft Translate: "))
((use-region-p) ;リージョン指定
(buffer-substring (region-beginning) (region-end)))
(t ;デフォルト
(thing-at-point 'sentence)))
""))
(defun my-microsoft-translator-auto-translate (arg)
"Read a string in the minibuffer with from-to is auto."
(interactive "p")
(let* ((translate-text (microsoft-translator--get-string arg)))
(microsoft-translator--process
translate-text
(if (string-match "\\cj" translate-text) "Japanese" "English")
(if (string-match "\\cj" translate-text) "English" "Japanese"))))
(advice-add 'microsoft-translator-auto-translate
:override #'my-microsoft-translator-auto-translate)
(defun my-microsoft-translator--translating (translate-text from to)
(with-current-buffer (get-buffer microsoft-translator-buffer-name)
(help-mode)))
(advice-add 'microsoft-translator--translating
:after #'my-microsoft-translator--translating)
(push '("*Microsoft Translator*" :height 0.5 :stick t) popwin:special-display-config)
(global-set-key (kbd "C-M-m") 'microsoft-translator-auto-translate)
ただし、日本語かどうかを判定しているので、日本語と英語の間の翻訳しかできない。
オリジナルのコードは英語かどうか(ascii文字だけから成っているかどうか)の判定をしているので英語と任意の言語の翻訳ができるが、上記の通り判定に失敗することがある。