サンプル・プログラム

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

ダウンロードしたファイルを解凍すると、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または空文字が返る。
そんな中、マイクロソフトの翻訳APIが精度・速度ともに優れているということを耳にし、それを使った多言語翻訳プログラムを作ってみることにした。