UWSCでWeb翻訳する

UWSC公式掲示板に何やら面白そうなものがあったので、使ってみた。
Webの翻訳APIとのこと。
http://muumoo.jp/news/2007/05/09/0translationapi.html




日本語→英語と英語→日本語で呼び分けないといけないのと、結果取得が微妙なので工夫してみた。


呼び分けの解消は、正規表現で入力文字がアルファベットあたりだけかを見て判定。
結果の取得は、XPathを利用してみた。


webTrans.uws

OPTION EXPLICIT

IFB GET_UWSC_NAME = "webTrans.uws" THEN
	WebTrans.Debug = TRUE
	DIM msg = "winnie the pooh"
	WHILE msg <> EMPTY
		msg = INPUT("Text", msg)
		msg = WebTrans.Trans(msg)
	WEND
ENDIF


MODULE WebTrans
	DIM _msxml
	DIM _regex

	PUBLIC Debug

	PROCEDURE WebTrans
		_msxml = CREATEOLEOBJ("MSXML2.XMLhttp")
		_regex = CREATEOLEOBJ("VBScript.RegExp")
		_regex.Pattern = "^[<#TAB>-~]*$"
		Debug = FALSE
	FEND

	PROCEDURE Send(msg)
		DIM pre
		IFB _regex.Test(msg) THEN
			pre = "ej_translation_api?_render=rss&text="
		ELSE
			pre = "je_translation_api?_render=rss&text="
			msg = ENCODE(msg, CODE_UTF8)
		ENDIF
		msg = pre + ENCODE(msg, CODE_URL)
		_msxml.Open("GET", "http://pipes.yahoo.com/poolmmjp/" + msg)
		_msxml.Send()
	FEND

	PROCEDURE WaitReady(cnt=100)
		WHILE _msxml.readyState <> 4 AND cnt > 0
			SLEEP(0.01)
			cnt = cnt - 1
		WEND
		IFB Debug THEN
			DIM msg = _msxml.responseText
			_regex.Pattern = "\n"
			_regex.Global = TRUE
			msg = _regex.Replace(msg, "<#CR>")
			PRINT msg
			_regex.Pattern = "^[<#TAB>-~]*$"
		ENDIF
	FEND

	FUNCTION Get(xpath="rss/channel/item/description")
		COM_ERR_IGN
			RESULT = _msxml.responseXML.selectSingleNode(xpath).text
			IF COM_ERR_FLG OR _msxml.status <> 200 THEN RESULT = EMPTY
		COM_ERR_RET
	FEND

	FUNCTION Trans(msg)
		Send(msg)
		WaitReady()
		RESULT = Get()
	FEND

ENDMODULE


結果itemが複数返るケースは、ま、いっか。一つしか認識しません。


ま、機械翻訳ですから、そうそうは期待できません。
単語より文の方が得意みたい。
INPUT出してるけど、クリップボード経由でLinersさんのヘルプみたいにもできますね。


json版で、ScriptControl使うのも手かも。
いや、ブックマークレットが一番便利か。