サンプル・プログラム

日本語から英語だけでなく、プルダウンで示される言語の間での自動翻訳が可能。ハングル語なども文字化けすることなく表示できる。

ダウンロードしたファイルを解凍すると、iso639.csv というファイルが出てくるが、スクリプト本体と同じフォルダにおいてほしい。
このファイルは、「en→英語」「ja→日本語」というように、ISO 639 で定められている言語名の 2 文字略称を日本語名称に置き換える辞書テーブル・ファイルである。
今回の PHP スクリプトから参照する。
Microsoft Translator API は簡素
Bing Developer Center からプログラム名などを登録する。Windows Live アカウントをお持ちの方は、そのまま利用できる。

今回利用するマイクロソフト翻訳API は、公式サイト「Microsoft Translator 開発者向けのサービス」に詳しいドキュメントがある。
使い方は極めてシンプルで、指定された URL に対し、先ほど取得したアプリケーション ID と原文などを GET 渡ししてやるだけ。戻り値は XML に似ているが、単純なタグ付きテキストなので、DOM XML や SimpleXML の知識がなくてもテキスト処理だけで十分だ。PHP の関数を利用するようなイメージで利用できる。
サンプル・プログラムの説明:初期化処理
0027: //BingアプリケーションID
0028: //http://www.bing.com/developers/appids.aspx にて登録のこと.
0029: define('APPLICATION_ID', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
0030:
0031: define('INIT_FROM', 'ja'); //原文言語コード(初期値)
0032: define('INIT_TO', 'en'); //翻訳言語コード(初期値)
0033: //原文サンプル
0034: define('INIT_SOUR', 'PHP(Hypertext Preprocessor)は、オープンソースのサーバ・サイド・スクリプト言語である。サーバ・サイド・スクリプトとは、データベースサーバなどのサーバ群とWebブラウザ(クライアント)を結ぶインターフェースの役割をするもので、Webサーバ上で動作する。HTMLに比べて、動的なページを実現することができる。');
0035:
0036: //リクエストURL
0037: //翻訳可能言語リスト取得API
0038: define('URL_LANGUAGES', 'http://api.microsofttranslator.com/V2/Http.svc/GetLanguagesForTranslate');
0039: //言語自動決定API
0040: define('URL_DETECT', 'http://api.microsofttranslator.com/V2/Http.svc/Detect');
0041: //翻訳API
0042: define('URL_TRANSLATE', 'http://api.microsofttranslator.com/V2/Http.svc/Translate');
0043:
0044: //ISO 639 言語略称リストのファイル名
0045: define('FNAME_ISO639', 'iso639.csv');
- APPLICATION_ID
- 前節で紹介したアプリケーション ID を記述すること。:
- INIT_FROM
- 原文言語の初期値を、ISO 639 の 2 文字略称で指定します。ここでは ja(日本語)を指定している。この値は画面上のプルダウンメニューから変更できる。:
- INIT_TO
- 翻訳言語の初期値を、ISO 639 の 2 文字略称で指定する。ここでは en(英語)を指定している。この値は画面上のプルダウンメニューから変更できる。。:
- INIT_SOUR
- 原文のサンプルを記述する。空文字にしておいて構わない。:
- URL_LANGUAGES, URL_DETECT, URL_TRANSLATE
- 今回利用した Microsoft Translator API の URL。詳しい使い方は後述する。
サンプル・プログラムの説明:原文言語の自動確定
0113: /**
0114: * 応答テキストから結果部分のみを取り出す
0115: * @param string $res レスポンス
0116: * @return string 翻訳テキスト
0117: */
0118: function _getResponse($res) {
0119: $pat = "/<[^\>]+>/ui"; //応答テキストのパターン
0120: if (preg_match($pat, $res) == 0) return FALSE;
0121:
0122: return preg_replace($pat, '', $res);
0123: }
0124:
0125: /**
0126: * Microsoft翻訳APIによるテキストの言語識別子の自動決定
0127: * @param string $text テキスト(INTERNAL_ENCODE)
0128: * @return string 言語識別子
0129: */
0130: function getAutoDetect($text) {
0131: //WebAPIにパラメータをGET渡しする
0132: $params = array(
0133: 'appid' => APPLICATION_ID,
0134: 'text' => urlencode($text)
0135: );
0136:
0137: $url = URL_DETECT . '?';
0138: foreach ($params as $key=>$val) {
0139: $url .= $key . '=' . $val . '&';
0140: }
0141:
0142: //翻訳処理実行
0143: if(($res = file_get_contents($url)) == FALSE) return FALSE;
0144: $dest = _getResponse($res);
0145:
0146: return $dest;
0147: }
呼び出しは
URL_DETECT?appid=APPLICATION_ID&text=URL エンコードした原文
のように行う。
結果は file_get_contents を使って一気に取り出せる。
この部分はユーザー関数 getAutoDetect に記述している。

結果文字列の中には XML のようなタグも含まれいるが、結果は下記のように単一のタグに囲まれているだけだ。
ユーザー関数 _getResponse を用意して、タグの中身だけ取り出せるようにした。
<string>結果</string>
サンプル・プログラムの説明:自動翻訳
0149: /**
0150: * Microsoft翻訳APIによる多国語間翻訳
0151: * @param string $sour 原文(INTERNAL_ENCODE)
0152: * @param string $from 原文の言語識別子
0153: * @param string $to 翻訳文の言語識別子
0154: * @return string 翻訳文(INTERNAL_ENCODE)
0155: */
0156: function getTranslate($sour, $from, $to) {
0157: //WebAPIにパラメータをGET渡しする
0158: $params = array(
0159: 'appid' => APPLICATION_ID,
0160: 'to' => $to,
0161: 'from' => $from,
0162: 'text' => urlencode($sour)
0163: );
0164:
0165: $url = URL_TRANSLATE . '?';
0166: foreach ($params as $key=>$val) {
0167: $url .= $key . '=' . $val . '&';
0168: }
0169:
0170: //翻訳処理実行
0171: if(($res = file_get_contents($url)) == FALSE) return FALSE;
0172: $dest = _getResponse($res);
0173:
0174: return $dest;
0175: }
URL_TRANSLATE?appid=APPLICATION_ID&text=URL エンコードした原文&from=原文言語略称&to=翻訳言語略称
この結果も file_get_contents を使って一気に取り出せる。

結果文字列の中には XML のようなタグも含まれいるが、結果は下記のように単一のタグに囲まれているだけだ。
<string>結果</string>
おまけ
0058: /**
0059: * 指定したボタンが押されてきたかどうか
0060: * @param string $btn ボタン名
0061: * @return bool TRUE=押された/FALSE=押されていない
0062: */
0063: function isButton($btn) {
0064: if (isset($_GET[$btn])) return TRUE;
0065: if (isset($_POST[$btn])) return TRUE;
0066: return FALSE;
0067: }

isButton は、前画面で、name 属性で指定された名前の submit ボタンが押されたかどうかを判定するユーザー関数だ。form の action が get でも post でも動くようにした。
0069: /**
0070: * 指定したパラメータを取り出す
0071: * @param string $key パラメータ名(省略不可)
0072: * @param bool $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0073: * @param mixed $def 初期値(省略時:空文字)
0074: * @return string パラメータ/NULL=パラメータ無し
0075: */
0076: function getParam($key, $auto=TRUE, $def='') {
0077: if (isset($_GET[$key])) $param = $_GET[$key];
0078: else if (isset($_POST[$key])) $param = $_POST[$key];
0079: else $param = $def;
0080: if ($auto) $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
0081: return $param;
0082: }
form の action が get でも post でも動くようになっている

第1 引数は、name 属性で指定されたパラメータの名前で、省略はできない。
第2 引数は、パラメータがマルチバイト文字(日本語など)の場合、自動的にコード変換を行うなら TRUE を、しないなら FALSE を指定する。省略時には TRUE となる。
第3 引数は、パラメータが見つからなかった場合に返す値を指定する。省略時には空文字が返る。

戻り値はパラメータの値。指定した名前のパラメータがない場合には NULL または空文字が返る。
参考サイト
- Microsoft Translator による機械翻訳のススメ(公式サイト)
- Microsoft Translator 開発者向けのサービス(公式サイト)
- Microsoft Translator の API を使ってみよう(Shigeya Tanabe's blog)
そんな中、マイクロソフトの翻訳API が精度・速度ともに優れているということを耳にし、それを使った多言語翻訳プログラムを作ってみることにした。