Solist Work Blog

Software engineer note

止まらないGoogle Translateを作る

Emacsのgoogle-translateが最近動かなくなることが多くなりました。 Google翻訳の仕様変更が激しいだけならまだよいのですが、 ブラウザを使わないEmacs上で完結した翻訳をGoogleに弾かれても文句はいえないので対処法を考えます。

最終的にブラウザに出力するような実装にすれば文句のつけられようがないのでこれは必須でしょう。 ブラウザ上でリアルタイムに修正できるのも使ってみると意外と便利で悪くありません。 Emacsgoogle-translateを使って実現できていた便利機能を実装すればとりあえずはよさそうです。

Emacsでリージョン選択した状態で

C-c t

を押すと選択した文章でGoogle翻訳できます。

  • リージョンで選択されている文章が英語のときは自動で英語から日本語翻訳になります。

リージョンで英語から日本語に翻訳

この状態で C-c t を押すと自動でGoogle翻訳されます。

Google翻訳の結果画面

  • リージョンで選択されている文章が日本語のときは自動で日本語から英語翻訳になります。

リージョンで日本語から英語に翻訳

この状態で C-c t を押すと自動でGoogle翻訳されます。

Google翻訳の結果画面

何も選択しない状態で C-c t を押すとミニバッファの入力を促されるので入力すればGoogle翻訳できます。

  • ミニバッファで入力した文章が英語のときは自動で英語から日本語翻訳になります。

ミニバッファで英語から日本語に翻訳

この状態で Enter を押します。

Google翻訳の結果画面

  • ミニバッファで入力した文章が日本語のときは自動で日本語から英語翻訳になります。

ミニバッファで日本語から英語に翻訳

この状態で Enter を押します。

Google翻訳の結果画面

以下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で動かす画面

この画像のように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を使用している方限定なので 使っていない場合はコメントアウトしてください。

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ