止まらないGoogle Translateを作る
Emacsのgoogle-translateが最近動かなくなることが多くなりました。 Google翻訳の仕様変更が激しいだけならまだよいのですが、 ブラウザを使わないEmacs上で完結した翻訳をGoogleに弾かれても文句はいえないので対処法を考えます。
最終的にブラウザに出力するような実装にすれば文句のつけられようがないのでこれは必須でしょう。 ブラウザ上でリアルタイムに修正できるのも使ってみると意外と便利で悪くありません。 Emacsのgoogle-translateを使って実現できていた便利機能を実装すればとりあえずはよさそうです。
Emacsでリージョン選択した状態で
C-c t
を押すと選択した文章でGoogle翻訳できます。
- リージョンで選択されている文章が英語のときは自動で英語から日本語翻訳になります。
この状態で C-c t を押すと自動でGoogle翻訳されます。
- リージョンで選択されている文章が日本語のときは自動で日本語から英語翻訳になります。
この状態で C-c t を押すと自動でGoogle翻訳されます。
何も選択しない状態で C-c t を押すとミニバッファの入力を促されるので入力すればGoogle翻訳できます。
- ミニバッファで入力した文章が英語のときは自動で英語から日本語翻訳になります。
この状態で Enter を押します。
- ミニバッファで入力した文章が日本語のときは自動で日本語から英語翻訳になります。
この状態で Enter を押します。
以下bind-keyを使う方はコメントアウトを外してdefine-keyをコメントアウトしてください。 関数名がchromiumになっていますが、デフォルトブラウザに指定されているブラウザで開きます。 気になる場合は名前を変えてください。
;; (bind-key "C-c t" 'chromium-translate)
(define-key global-map (kbd "C-c t") 'chromium-translate)
(require 'url-util)
(defun chromium-translate ()
"Open google translate with chromium."
(interactive)
(if (use-region-p)
(let ((string (buffer-substring-no-properties (region-beginning) (region-end))))
(deactivate-mark)
(if (string-match (format "\\`[%s]+\\'" "[:ascii:]")
string)
(browse-url (concat "https://translate.google.com/?source=gtx#en/ja/"
(url-hexify-string string)))
(browse-url (concat "https://translate.google.com/?source=gtx#ja/en/"
(url-hexify-string string)))))
(let ((string (read-string "Google Translate: ")))
(if (string-match
(format "\\`[%s]+\\'" "[:ascii:]")
string)
(browse-url
(concat "https://translate.google.com/?source=gtx#en/ja/" (url-hexify-string string)))
(browse-url
(concat "https://translate.google.com/?source=gtx#ja/en/" (url-hexify-string string)))))))
chromium-translateだけ使うならここまでで終わりです。
Emacsで切り替えて両方使いたい場合
この画像のようにgoogle-translateを使用すると、Emacs内で翻訳は完結します。 google-translateが正常に動いているときはgoogle-translateをデフォルトで使い動かない時は今作ったchromium-translateを使えるようにしましょう。 さらに以下のコードを追加してください。
M-x toggle-translate
これでtranslateに使う関数を切り替えることができます。 デフォルトはgoogle-translateを使うコードが動きます。 何らかの理由でgoogle-translateが動かないときは M-x toggle-translateで切り替えるとchromium-tramslateで翻訳できるようになります。
(require 'google-translate)
(require 'google-translate-default-ui)
(bind-key "C-c t" 'google-translate-auto)
(defvar toggle-translate-flg nil
"Toggle flg.")
(defun toggle-translate ()
"Toggle translate function."
(interactive)
(if toggle-translate-flg
(progn
(bind-key "C-c t" 'google-translate-auto)
(setq toggle-translate-flg nil))
(progn
(bind-key "C-c t" 'chromium-translate)
(setq toggle-translate-flg t))))
(defun google-translate-auto ()
"Automatically recognize and translate Japanese and English."
(interactive)
(if (use-region-p)
(let ((string (buffer-substring-no-properties (region-beginning) (region-end))))
(deactivate-mark)
(if (string-match (format "\\`[%s]+\\'" "[:ascii:]")
string)
(google-translate-translate
"en" "ja"
string)
(google-translate-translate
"ja" "en"
string)))
(let ((string (read-string "Google Translate: ")))
(if (string-match
(format "\\`[%s]+\\'" "[:ascii:]")
string)
(google-translate-translate
"en" "ja"
string)
(google-translate-translate
"ja" "en"
string)))))
(push "*Google Translate*" popwin:special-display-config)
最終行はpopwinを使用している方限定なので 使っていない場合はコメントアウトしてください。
ブログ記事を投稿したらTwitterでお知らせいたします。ブログを気に入っていただけた方はお気軽にフォローしてください。
— Solist Work (@SolistWork) 2018年11月27日
関連記事
最新記事
タグ一覧
-
ansible (2)
application (8)
chrome (1)
command (14)
django (1)
docker (3)
document (1)
emacs (14)
git (2)
google (1)
hugo (1)
kubernetes (1)
linux (20)
makefile (6)
mariadb (2)
melpa (1)
postgresql (2)
python (1)
security (2)
terminal (11)
thinkpad (2)
work (6)
zsh (10)