UWSCで簡単な翻訳を行う

UWSC公式掲示板で、「20文字程度のたくさんの翻訳ができません。誰かやって」とかいう丸投げ案件があがっていた。
stuncloudさんが丁寧な回答をしているので、良かったのだけど、一応書いてみて、どうしようか検討してたヤツをここに晒す。


これは、Googleの翻訳APIではなく、Google翻訳が隠しで提供しているAPIを叩いている。
規約的に問題あると思うし、仕様変更で使えなくなる可能性もあることに留意願いたい。



スクリプト

trancelate.uws

OPTION EXPLICIT

IFB LENGTH(PARAM_STR) THEN
    // Test
    DIM res = "NG"
    SELECT PARAM_STR[0]
    CASE "TEST"
        res = Trancelate.Do("私はUWSCが好きです。")
        IF res = "I like UWSC." THEN res = "OK"
    DEFAULT
        res = Trancelate.Do(PARAM_STR[0])
    SELEND
    MSGBOX(res)
ELSE
    IFB GET_UWSC_NAME = "trancelate.uws" THEN
        // DEMO
        DIM msg = "test"
        WHILE LENGTH(msg) > 0
            msg = INPUT("翻訳したい日本語を入力してください。")
            IF LENGTH(msg) > 0 THEN MSGBOX(Trancelate.Do(msg))
        WEND
    ENDIF
ENDIF



MODULE Trancelate

    CONST DEF_URL = "https://translate.googleapis.com/translate_a/single?"
    CONST JA_EN_PARAM = "client=gtx&sl=ja&tl=en&dt=t&q="

    DIM _sc

    PROCEDURE Trancelate()
        _sc = CREATEOLEOBJ("ScriptControl")
        _sc.Language = "JScript"
        _sc.ExecuteStatement("Array.prototype.Get = function(i) { return this[i]; }")
    FEND

    FUNCTION Do(msg, async=FALSE, method="GET")
        DIM http = CREATEOLEOBJ("MSXML2.XMLhttp")
        http.open(method, DEF_URL + JA_EN_PARAM + ENCODE(ENCODE(msg, CODE_UTF8), CODE_URL), FALSE)
        http.send()
        RESULT = http.statusText
        IFB http.status = 200 THEN
            // JSONをEvalしちゃうのは非推奨
            DIM res = _sc.Eval(http.responseText)
            RESULT = res.Get(0).Get(0).Get(0)
        ENDIF
    FEND

ENDMODULE

ダメな点

  • Google翻訳の隠しAPIの勝手利用
  • 応答JSONをEvalしている
  • 応答JSONの構造が現在のものから変わらない想定
  • 日本語->英語のみ


まあ、日本語->英語のみなのは、ちょっと修正すれば対応できるけどね。