2009年12月3日木曜日

(Code: sh) gtrans2

Google Translate を利用して露英翻訳するシェルスクリプトです。以前書いたコードを改良。
#!/bin/sh

PROG=`basename $0`

## check cmd
LIST="curl urie"
for CMD in $LIST ;do
TEST_CMD=`which $CMD`
if [ -z "$TEST_CMD" ] ; then
echo "$PROG: Error: we need command \"$CMD\"" >&2
exit 1
fi
done

## check arg
if [ -z "$1" ] ; then
echo "$PROG: Error: need an arg (Russian phrase)" >&2
exit 1
elif [ $# -gt 1 ] ; then
echo "$PROG: Error: too many args. need just an arg (Russian phrase)" >&2
exit 1
fi
TEXT="$1"


## body
UA='Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)'
URL=http://translate.google.com/translate_a/t
TEXT_URIE=`echo "$TEXT" | urie`

RESULT=`curl -Ss -m 10 -G -A "$UA" "$URL" -d client=t -d text="$TEXT_URIE" -d sl=ru -d tl=en`
TEST_CURL=$?
#echo "$RESULT" ##debug
if [ $TEST_CURL -ne 0 ] ; then
echo "$PROG: Error: curl failed" >&2
exit 1
fi

TEST_RESULT=`echo "$RESULT" | grep '"trans"'`
if [ -n "$TEST_RESULT" ] ; then ## for empty translation result {"src":"en"}
echo "$RESULT" | sed 's/.*"trans":"\([^"]*\)".*/\1/'
fi

  • urieで翻訳したいフレーズをURIエンコード

  • curlで翻訳したいフレーズをGETで送信

  • sedで結果をパース

UserAgentがcurlだと拒絶される、空だと翻訳結果がKOI8-Rで返ってきてUTF-8の環境でパースしづらくなるのでIEに偽装しています。UAがIEやFirefoxだとUTF-8で結果が返ってくるみたい。以前書いたコードと異なり"http://translate.google.com/"でなく"http://translate.google.com/translate_a/t"に翻訳したいフレーズを送信しています。
{"sentences":[{"trans":"short","orig":"короткий","translit":""}],"dict":[{"pos":"","terms":["s"]},{"pos":"adjective","terms":["short","brief","little","small","short","skimpy"]}],"src":"ru"}
こんな感じの翻訳結果をGoogleから受信できます。"http://translate.google.com/"のものより短い!パースし易い!!URIエンコーディングにCで書いたコマンド(urie)を使っています。GETで送信(curl -G)するとPOSTするより送信データーが69バイト短くて済むのでそうしてます。


テスト翻訳
$ ./gtrans 'здравств'
hello

$ ./gtrans 'я из Японии'
I'm from Japan

$ ./gtrans 'только хорошие умирают молодыми'
only the good die young

$ ./gtrans 'through ascii phrase'
through ascii phrase

$ ./gtrans ' '
(出力なし)

$ ./gtrans '誤って日本語を入力'
誤っ て 日本語 を 入力

$ ./gtrans `echo "えすじす" | iconv -t SJIS-WIN`
????????
まずまず動作。LANG=ja_JP.UTF-8のシェルでテスト翻訳しました。
文字コードが混在した環境で自動翻訳しようとすると翻訳フレーズごとに文字コードの自動判定も必要になりそう。ロシア版ポトリスではロシア語にCP1251、日本語にSJIS-WINが使われてるみたい。


環境

OS: Linux
debian-lenny