2008年1月7日月曜日

APIを利用して英語を日本語に翻訳するモジュール

英語を日本語に翻訳します。
ネットに接続するため、少し時間がかかります。
// 英語->日本語変換サンプル
// 翻訳APIを使用
//     http://muumoo.jp/news/2007/05/09/0translationapi.html
// 参考:mod_rss.as

#module mod_translate
#deffunc rss2load_init@mod_translate
    newcom oDom,"Microsoft.XMLDOM"
    oDom("async") = "FALSE"
    comres elm_desc
    return

#deffunc rss2load@mod_translate array desc, str url, int p_max
    oDom->"load" url
    oRoot = oDom("documentElement")
    if varuse(oRoot) == 0 : return 1
    if oRoot("tagName") != "rss" : return 2

    maxnum = p_max
    if maxnum <= 0 : maxnum = 5

    oDom->"getElementsByTagName" "description"
    max = limit(elm_desc("length"), 1, maxnum)

    sdim desc, 64, max
    repeat max
        node = elm_desc("item"cnt)
        node2 = node("firstChild")
        desc(cnt) = node2("nodeValue")
    loop

    return 0

#deffunc rss2load_clean onexit
    if vartype(oRoot) == vartype("comobj") {
        delcom node : delcom node2 : delcom oRoot
    }
    delcom elm_desc : delcom oDom
    return

// 英文を和訳します。変換に成功するとstatに0が代入され、第1引数の変数に変換結果が代入されます。
// 変換に失敗するとstatに1が代入されます。
#deffunc eng2jp var result, str before, local after
    rss2load after, "http://pipes.yahoo.com/poolmmjp/ej_translation_api?_render=rss&text=" + before
    if (stat == 0)&(length(after) == 2) {
        // after(0)にはAPIの説明が代入されている
        result = after(1)
        return 0
    } else {
        return 1
    }
#global
    rss2load_init@mod_translate
// モジュールここまで

    target = "Good morning! How are you today?""I'm fine, thank you. And you?""So so."
    foreach target
        mes target(cnt)
        eng2jp result, target(cnt)
        if stat == 0 : mes "-> " + result
    loop
    stop

2 件のコメント:

eller さんのコメント...

後ほど正式に反映しますが、クリーンアップ用命令は以下のように修正する必要があります。

#deffunc rss2load_clean onexit
if vartype(oRoot) == vartype("comobj") {
delcom node : delcom node2 : delcom oRoot
}
delcom elm_desc : delcom oDom
return

delcomを明示的に実行する必要性は無いので、命令自体を削除しても問題は無いのですが……。
なんとなくですが、明記しておきたいものです。

eller さんのコメント...

修正しました。