Emacs ã§ããã¹ã翻訳
(追è¨)
plus ããããã¡ã¼ã«ããããã¾ãã.
ã¾ã 確èªãã¦ã¾ããã, è²ã ã¨ã¾ãããã§ã.
å°ãã¨ã, physical-line ãå ¥ãã¦ãªãã¨åããªããã¨ã夿ãã¦ãã¾ã.
ä¿®æ£çã調ã¹ã¦ up ã§ããããã«ãã¾ã.
(ããã«è¿½è¨)
ã¨ãããã, plus ããã«é ããããããé©ç¨ãããã¼ã¸ã§ã³ãç½®ãã¦ããã¾ã:
text-translator.el.txt
èªåã§ãããã«æ¹è¯ãå ãã¦ã¿ãäºå®ã§ã.
(ããã«è¿½è¨(ä¸å¿))
ãã¯ããã¦ããã¦ããæ¹ãå± ãã®ã§, ãã¾ããã§ãã, ä¸å¿.
text-translator ã®ã¨ã³ããªã¯, 以ä¸ã®ã¨ã³ããªã«ãã¾ãã.
ä»å¾æ´æ°ããã£ãå ´åã«æ´æ°ããã®ãä¸è¨ã¨ã³ããªã§, ããå°ç¨ã«æ°ãã«ã¨ã³ããªã¯ä½ãã¾ãã.
ã¨ãããã, ã§ãã.
plus ããããã®ã¡ã¼ã«ã§ã®ã¢ããã¤ã¹ããã£ããã¨ãªã, ååå¾®å¦ã ã£ãé¨åã¯, 大åãã·ã«ãªã£ãã¨æã.
ã¾ã ã¾ã ãã°ããã¨æããããã©, ã¨ããããå
¬é. ãã, ä¸å¿ãããªãã«ç°¡åãªåä½ãã¹ãã¯ããã. ãã¡ãã.
excite, google, altavista ãå©ç¨ãã¦, æ¥æ¬èªâè±èª, è±èªâæ¥æ¬èªã®ç¿»è¨³ãã§ãã.
前回ã®ãã®ããã®å¤§ããªæ´æ°ç¹ã¯,
ã¾ã, ååã text-translate ãã text-translator ã«å¤æ´ãããã¨.
Ruby ã®ã¹ã¯ãªãããå®å
¨ã«æé¤ãã¦, elisp ãªã³ãªã¼ã«ãããã¨.
翻訳ããããã«å©ç¨ã§ãããµã¤ãã« altavista ã追å ãããã¨ã®3ã¤.
ç´°ããã®ãã¡ããã¡ãããã.
使ç¨ããã«ã¯, ä¸è¨ã³ã¼ãã text-translator.el ã®ãããªãã¡ã¤ã«ã«ä¿åãã¦, ãã¼ããã¹ã®éãæã«ç½®ã.
ããã¦, .emacs ã«ä»¥ä¸ã®ãããªä¸æã追å ãã.
(require 'text-translator) (global-set-key "\C-xt" 'text-translator)
ãã¼å²ãå½ã¦ã¯, ã好ã¿ã§.
ãªã¼ã¸ã§ã³ã«é¸æããç¯å²ã翻訳ãã¾ã. ããã©ã«ãã§ä½¿ç¨ãã翻訳ãµã¤ãã¯, excite ã®è±èªâæ¥æ¬èªã§ã.
ä»ã®ãµã¤ãã使ç¨ããããã°, C-u, ã§ãã¤ãã¦é¢æ°ãå®è¡ãã¦ãã ãã.
ãªã¼ã¸ã§ã³ã鏿ãã¦ãããªãã¨, 翻訳ããæååã®å
¥åãä¿ããã¾ã.
以ä¸ã³ã¼ã.
(追è¨)ãã¡ã¤ã«ç½®ãå ´ã«ãã¡ã¤ã«ãç½®ãã¨ãã¾ãã â text-translator.el.txt.
æ¡å¼µå .txt ãåé¤ãã¦ãã¼ããã¹ã®éã£ãæã¸ç½®ãã¦ãã ãã.
;;; -*- Coding: iso-2022-7bit -*- ;;; text-translator.el --- Text Translator ;; Copyright (C) 2007 khiker ;; Author: khiker <[email protected]> ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; ã¦ã§ãä¸ã«åå¨ããããã¹ã翻訳ãè¡ã£ã¦ããããµã¤ããå©ç¨ãã¦, ;; Emacs ä¸ã§æååã®ç¿»è¨³ãè¡ã elisp ã§ã. ;; ;; M-x text-translator ;; 翻訳ãè¡ã颿°. ;; ãªã¼ã¸ã§ã³ã®é¸æãè¡ããã¦ããã¨, ãã®ç¯å²ã翻訳ãã¾ã. ;; ãªã¼ã¸ã§ã³ã®é¸æãè¡ããã¦ããªãã¨, 翻訳ãããããã¹ãã®å ¥åã ;; ä¿ãã¾ã. ;; æ¥é è¾ã¨ãã¦, C-u ãä¸ããã¨, 使ç¨ãã翻訳ãµã¤ã, ;; 翻訳形å¼ã®é¸æãä¿ã. ;; ;; ãã¼ã¸ã®é¢æ°ã®å²å½ã¦ã®ä¾ : ;; (global-set-key "\C-x\M-t" 'text-translator) ;; ;; [è¨å®ã§ãã夿°] ;; ;; text-translator-auto-window-adjust ;; ç¿»è¨³çµæã表示ããããã®åå²ãã¦åºç¾ãããããã¡ã®é«ãã ;; ç¿»è¨³çµæã®è¡æ°ã«å¾ã£ã¦èª¿ç¯ãããã©ãã. ;; ããã©ã«ãã§ t. 調ç¯ããã¨ãªã£ã¦ãã. ;; ;; text-translator-leave-string ;; 翻訳ãããæååãç¿»è¨³çµæã®ãããã¡ã«æ®ããã©ãã. ;; ããã©ã«ãã§ nil. æ®ããªãã¨ãªã£ã¦ãã. ;; ;; text-translator-pre-string-replace-alist ;; 翻訳ãµã¤ãã«æå ¥ããæååãããã«è¨è¼ããã¦ããè¦åã«å¾ã ;; ç½®ãæãã. ;; ;; text-translator-post-string-replace-alist ;; ç¿»è¨³çµæã®æååãããã«è¨è¼ããã¦ããè¦åã«å¾ãç½®ãæãã. ;; ;; text-translator-site-data-alist ;; ããã¹ã翻訳ã«ä½¿ç¨ãããµã¤ãã®è¨å®ãè¨è¿°ãã¦ãã飿³ãªã¹ã. ;; è¨è¿°ããã¦ããå 容ã¯, ãã. ;; (ã翻訳ãµã¤ãã®ååã ;; ã翻訳ãµã¤ãã®ãã¹ãã ;; ãPOSTããå§ã¾ã䏿ã ;; ãPOSTã§æå ¥ããã¢ãã¬ã¹ 翻訳åã®æååãåãè¾¼ãæã¯ %s ãè¨è¿°ããã ;; ããã³ã¼ãã«ä½¿ç¨ããæåã³ã¼ãã ;; ã翻訳å¾ã®æååãæãåãããã«ä½¿ç¨ããæ£è¦è¡¨ç¾ã) ;; ;; [ã³ã¡ã³ã] ;; ;; truncate-partial-width-windows ã¯, nil ã«è¨å®ãã¦ãããæ¹ãè¯ããã. ;; ãããã¡ãä¸ä¸ã«åå²ãã¦è¡¨ç¤ºããã®ã§. ;; ;; [è¬è¾] ;; ;; ãã® text-translator.el ã使ããã«ããã, ;; ããã°ã®ã³ã¡ã³ããã¡ã¼ã«ã§ã¢ããã¤ã¹ãé ãã¾ãã. ;; ãããã¨ããããã¾ã. ;;; Code: (defconst text-translator-buffer "*translated*" "ç¿»è¨³çµæã表示ãããããã¡å.") (defvar text-translator-auto-window-adjust t "åå²ãã¦è¡¨ç¤ºããã¦ã£ã³ãã¦ã®é«ãã調ç¯ãããã©ãã.") (defvar text-translator-leave-string nil "翻訳åã®æååãæ®ããã©ãã.") (defvar text-translator-pre-string-replace-alist '(("`" . "â") ("$" . "ï¼") ("&" . "ï¼") (";" . "ï¼") ("%" . "ï¼ ") ("+" . "ï¼") ("\n" . " ") ("\r" . "") ("–" . "-") ("•" . "ã»") ("â" . "\"") ("â" . "\"")) "翻訳ãããæååã夿ããè¦å.") (defvar text-translator-post-string-replace-alist '(("ã" . "ã\n") ("\r" . "") ("'" . "'") (""" . "\"") ("&" . "&") ("<" . "<") (">" . ">") ("–" . "-")) "翻訳å¾ã®æååã夿ããè¦å.") (defvar text-translator-site-data-alist '(("excite_enja" "www.excite.co.jp" "POST /world/english/ HTTP/1.0" "wb_lp=ENJA&before=%s" japanese-shift-jis-unix "<input type=\"hidden\" name=\"after\" value=\"\\([^\"]*\\)") ("excite_jaen" "www.excite.co.jp" "POST /world/english/ HTTP/1.0" "wb_lp=JAEN&before=%s" japanese-shift-jis-unix "<input type=\"hidden\" name=\"after\" value=\"\\([^\"]*\\)") ("google_enja" "translate.google.com" "POST /translate_t HTTP/1.0" "langpair=en|ja&ie=utf-8&oe=utf-8&text=%s" utf-8-dos "<div id=result_box dir=ltr>\\([^<]*\\)") ("google_jaen" "translate.google.com" "POST /translate_t HTTP/1.0" "langpair=ja|en&ie=utf-8&oe=utf-8&text=%s" utf-8-dos "<div id=result_box dir=ltr>\\([^<]*\\)") ("altavista_enja" "babelfish.altavista.com" "POST /tr HTTP/1.1" "doit=done&intl=1&tt=urltext&trtext=%s&lp=en_ja&btnTrTxt=Translate" utf-8-dos " <td bgcolor=white class=s><div style=padding:10px;>\\([^<]*\\)") ;; " <td class=s><input type=hidden name=\"q\" value=\"\\([^\"]*\\)") ("altavista_jaen" "babelfish.altavista.com" "POST /tr HTTP/1.1" "doit=done&intl=1&tt=urltext&trtext=%s&lp=ja_en&btnTrTxt=Translate" utf-8-dos " <td bgcolor=white class=s><div style=padding:10px;>\\([^<]*\\)")) "ããã¹ã翻訳ã«ä½¿ç¨ãããµã¤ãã®è¨å®ãè¨è¿°ãã¦ãã飿³ãªã¹ã. è¨è¿°ããã¦ããå 容ã¯, ãã. (ã翻訳ãµã¤ãã®ååã ã翻訳ãµã¤ãã®ãã¹ãã ãPOSTããå§ã¾ã䏿ã ãPOSTã§æå ¥ããã¢ãã¬ã¹ 翻訳åã®æååãåãè¾¼ãæã¯ %s ãè¨è¿°ããã ããã³ã¼ãã«ä½¿ç¨ããæåã³ã¼ãã ã翻訳å¾ã®æååãæãåãããã«ä½¿ç¨ããæ£è¦è¡¨ç¾ã)") (defun text-translator (arg) "Excite 翻訳ã Google Translation ã使ã£ã¦, ããã¹ã翻訳ããã颿°. 1. mark ã active ã ã£ã. - åç½®å¼æ°ãä¸ãããã : 1. 使ç¨ãã翻訳ãµã¤ãã鏿ãã. 2. 鏿ããå½¢å¼ã§ç¿»è¨³ãã. - åç½®å¼æ°ãä¸ããããªãã£ã : excite_enja ã§ãªã¼ã¸ã§ã³ã«å ¥ããç¯å²ã翻訳ãã. 2. mark ã deactive ã ã£ã. - åç½®å¼æ°ãä¸ãããã. 1. 使ç¨ãã翻訳ãµã¤ãã鏿ãã. 2. 鏿ããå½¢å¼ã§ãããããã¡ããå ¥åããå¤ã翻訳ãã. - åç½®å¼æ°ãä¸ããããªãã£ã. excite_enja ã§ãããããã¡ããå ¥åããå¤ã翻訳ãã." (interactive "P") (let ((def (caar text-translator-site-data-alist))) ;; åç½®å¼æ°ããã£ããªãã°, 使ç¨ãã翻訳形å¼ã鏿ãããã®ã«å¤æ´. (when arg (setq def (completing-read (format "Select translation type [default:%s] : " def) text-translator-site-data-alist nil t nil nil def))) (text-translator-client def (if mark-active (buffer-substring-no-properties (region-beginning) (region-end)) (read-string (format "translate[%s] : " def)))) (deactivate-mark))) (defun text-translator-client (type string) "æå®ãããµã¤ãã«ç¿»è¨³ãããèªå¥ãæã, ç¿»è¨³çµæãåãåã颿°." (let* ((buf text-translator-buffer) (string (text-translator-replace-string string 0)) (type (assoc type text-translator-site-data-alist)) (proc (open-network-stream "Web Connection" buf (nth 1 type) 80)) (enc-str (text-translator-url-encode-string string (nth 4 type))) (post-str (progn (string-match "%s" (nth 3 type)) (replace-match enc-str nil nil (nth 3 type)))) (truncate-partial-width-windows nil) rtn-string) (save-current-buffer (set-buffer (get-buffer-create buf)) (erase-buffer) (set-process-coding-system proc (nth 4 type) 'binary) (process-send-string proc (format "%s%s%s%s%s%s%s%s%s%s%s%s%s" (nth 2 type) "\r\n" (concat "HOST: " (nth 1 type)) "\r\n" "Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: " (string-bytes post-str) "\r\n" "\r\n" post-str "\r\n" "\r\n")) ;; (message "%s" (format "%s" (process-status "Web Connection"))) (while (string= (format "%s" (process-status "Web Connection")) "open") (sleep-for 0.01)) ;; ãProcess Web Connection connection broken by remote peerã ã¨ãã ;; ã¡ãã»ã¼ã¸ãæ¶ãããã ãã«çªå µã使ç¨ãã¦ãã. ;; æ¬æ¥ã®ä½¿ãæ¹ãã©ããåãããªãã»ã»ã». 䏿ããããªãã»ã»ã». (set-process-sentinel proc '(lambda (process status) nil)) ;; (message "%s" (format "%s" (process-status "Web Connection"))) (re-search-backward (nth 5 type)) (setq rtn-string (text-translator-replace-string (match-string 1) 1)) (erase-buffer) (when text-translator-leave-string (insert (concat string "\n\n"))) (insert (concat rtn-string "\n")) (end-of-buffer) (display-buffer buf) ;; ã¦ã£ã³ãã¦ã®å¤§ããã調ç¯ããé¨å (when text-translator-auto-window-adjust (balance-windows) (let ((height (text-translator-count-line))) ;; ã¦ã£ã³ãã¦ã®å¤§ãããå ¨ä½ã®åå以ä¸ã«ãªããªãã°, ååã«çãã (when (< height (window-height)) (shrink-window (if (< (text-translator-count-line) 4) (- 4 (window-height)) (- (text-translator-count-line) (- (window-height) 1)))))))))) (defun text-translator-replace-string (string state) "弿° `string' ã«æå®ãããæååã è¦å `text-translator-pre-string-replace-alist', ãããã¯, `text-translator-post-string-replace-alist' ã«å¾ã夿ãã颿°. 第2弿° `state' ã¯, 0 ã 1 ã®å¤ãåã. 0 ãªãã°, text-translator-pre-string-replace-alist ã, 1 ãªãã°, text-translator-post-string-replace-alist ãé©ç¨ããã." (with-temp-buffer (set-buffer (get-buffer-create text-translator-buffer)) (erase-buffer) (insert string) ;; ç´æ¥ä½¿ç¨ã§ããªãæåãå ¨è§ã«å¤æãã. (format-replace-strings (if (= state 0) text-translator-pre-string-replace-alist text-translator-post-string-replace-alist)) (buffer-substring-no-properties (point-min) (point-max)))) (defun text-translator-count-line () "ç¾å¨, ãããã¡ã«è¡¨ç¤ºããã¦ãã, è¦ãç®ã®è¡æ°ãè¨ã颿°. `text-translate-auto-window-adjust' ã t ã®å ´åã«ä½¿ç¨ããã. physical-line.el ããããã©ããã§åä½ãåãæ¿ãã¦ã." (save-excursion (beginning-of-buffer) (do ((num 1)) ((= (point) (point-max)) num) (next-line) (if physical-line (setq num (+ num 1)) (progn (move-end-of-line nil) (setq num (+ num 1 (/ (current-column) (window-width))))))))) ;; google2.el ããæå. (defun text-translator-url-encode-string (str &optional coding) (apply (function concat) (mapcar (lambda (ch) (cond ((eq ch ?\n) ; newline "%0D%0A") ((string-match "[-a-zA-Z0-9_:/]" (char-to-string ch)) ; xxx? (char-to-string ch)) ; printable ((char-equal ch ?\x20) ; space "+") (t (format "%%%02X" ch)))) ; escape ;; Coerce a string to a list of chars. (append (encode-coding-string (or str "") (or coding 'iso-2022-jp)) nil)))) (provide 'text-translator) ;;; text-translator.el ends here
以åã®ã¨ã³ããª
æ´æ°æå»
2007å¹´, 4æ29æ¥, 5:31