Help us understand the problem. What is going on with this article?

Microsoft Translator テキスト API [TranslateArray] で、複数の語句を翻訳する

More than 3 years have passed since last update.

やること

Microsoft Translator テキスト API のエンドポイント [TranslateArray] を利用して、複数の語句を翻訳する (タイトルの通り)

この記事は、2017年3月時点の情報にもとづいて記述しました。

流れ

  1. Microsoft Translator テキスト APIを有効化して、APIキーを取得する
  2. トークンを取得する
  3. トークンを使ってTranslator テキスト APIを叩く
  4. サンプルコード
  5. 参考情報

1-2について

1,2の「APIキーを取得する」「トークンを取得する」については、下記の記事をご参照ください。

トークンを使ってTranslator テキストAPIを叩く

Microsoft Translator テキスト APIには、複数の語句を翻訳するためのエンドポイントとして「TranslateArray」があります。

ここに対して、POSTメソッドで複数の語句を送信すると、翻訳されたデータが返ってきます。

個人的にハマった点は以下の2点

  • Request Body はXMLで送る必要がある
  • JavaScriptによる送信はできない

POSTする際の Request Body はXMLデータとして送信する必要がある、ということです。
JSON,配列などで送信してみたところ、いずれも正常なレスポンスが取得できませんでした。

XMLによるRequestBody のサンプルは、以下に記述されていました。

https://msdn.microsoft.com/ja-jp/library/ff512422.aspx?f=255&MSPPError=-2147217396#phpexample

また、JavaScriptによる通信は不可能なようです。何度か試しましましたが、JavaScriptではどうしても405エラーが返ってしまい、うまく行きませんでした。トークンの取得は、JavaScriptからPOSTしても問題ないのに、なぜだろう。

このため、今回はphpでサンプルコードを書いてみました。

[TranslateArray] にデータを送信する際は、以下の3つが必須となります。

  • appid
    • 送信する文字列は [Bearer] + [(半角スペース)] + [トークン] となる。Header に[Authorization]で指定して送信してもOK
  • texts
    • 翻訳したい文字列をXMLの配列として指定
  • to
    • 翻訳したい言語を指定。日本語に翻訳したい場合は [ja]。英語に翻訳したい場合は [en]となる。

サンプルコード

今回は
* フォーム画面から、テキストおよび複数行テキストの2つのデータを入力する
* jQueryを利用して、翻訳データを取得するphpコードへ値を渡す
* phpからの返り値を、フォーム画面に表示する

という流れで書いてみました。日本語を入力すると、英語の翻訳結果が返ってきます。

フォーム画面 (html側)

<!DOCTYPE html>
<html lang="ja">
<head>
<title>Microsoft Translator テキスト API で複数英訳を行うサンプルコード</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>

  "use strict"

  $(function() {

    // 文字が入力されたらイベント発火

    $("#translate").click(function() {
      $.ajax({
        url: '翻訳データを取得するphpファイルを指定',
        type: 'POST',
        data: {
          request1: $("#title").val(),
          request2: $("#body").val(),
        }

      }).done(function(data, status, xhr) {

        $("#en-title").val(data.result1[0]);
        $("#en-body").val(data.result2[0]);

      }).fail(function(xhr, status, error) {

        alert("通信に失敗しました。");

      });
    });
  });
</script>
</head>

<body>

  <h1>Microsoft Translator テキスト API サンプル</h1>
  <h2>複数フォームの入力データを英語に翻訳します。</h2>

  <p>  <input type="text" id="title" placeholder="タイトル" size="40"></p>
  <p>  <textarea name="body" rows="4" cols="40" id="body" placeholder="本文"></textarea></p>
  <p>  <input type="submit" id="translate" value="翻訳"></p>

  <p>  <input type="text" id="en-title" size="40"></p>
  <p>  <textarea name="body" rows="4" cols="40" id="en-body"></textarea></p>

</body>
</html>

翻訳データ取得画面(php側)

<?php

// Microsoft Tranlator テキスト API を使うためのAPIキーを定数として設定

define('APIKEY', 'APIキーを記述する');


// 取得した翻訳文字列を返すために Content-type を設定。JSON形式で返す

header('Content-type: application/json; charset=utf-8');


// フォームから2項目の値を受けとり、翻訳関数を実行する。
// どちらかが欠けていた場合エラーとする

if (isset($_POST['request1']) && ($_POST['request2']) ) {

  $response = getTranslation();
  echo ($response);

} else {

// エラー処理

}


// 翻訳用関数 getTranslation を定義
// フォームから入力されたデータをXMLに整形して、Microsoft Translator テキスト APIへPOSTする

function getTranslation() {

  $token = getToken();
  $key = "Bearer" . " " . $token;
  $uri = 'https://api.microsofttranslator.com/V2/http.svc/TranslateArray';

  $headers = array(
    "Authorization: " . $key,
    "Content-Type: application/xml",
  );

// XMLでパラメーター指定

  $word1 = htmlspecialchars($_POST['request1']);
  $word2 = htmlspecialchars($_POST['request2']);

  $params = <<<EOF

<TranslateArrayRequest>
  <AppId />
  <Texts>
    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">$word1</string>
    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">$word2</string>
    </Texts>
  <To>en</To>
</TranslateArrayRequest>

EOF;

  $ch = curl_init();

  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_URL, $uri); 
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $html =  curl_exec($ch);
  curl_close($ch);

// SimpleXMLElementを利用してオブジェクト生成

  $data = new SimpleXMLElement($html);

// 翻訳結果をJSONデータに変換してフォーム画面へ返す

$result =array(

'result1' => $data->TranslateArrayResponse[0]->TranslatedText, 
'result2' => $data->TranslateArrayResponse[1]->TranslatedText,

);

$result = json_encode($result);

return $result;

}


// Microsoft Tranlator テキスト APIを利用するためのトークンを取得する関数

function getToken(){

  $headers = array(
    "Content-Type: application/json",
    "Accept: application/jwt",
    "Ocp-Apim-Subscription-Key: " . APIKEY,
    "Content-Length:0"
  );

  $url     = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken";
  $ch      = curl_init();

  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $html = curl_exec($ch);

  return $html;
  curl_close($ch);
}

?>

TranslateArray.png

参考情報

https://www.microsoft.com/ja-jp/translator/getstarted.aspx
https://www.microsoft.com/cognitive-services/en-us/documentation
http://docs.microsofttranslator.com/text-translate.html
https://msdn.microsoft.com/ja-jp/library/ff512422.aspx

TranslateArray は

  • 項目は2000項目まで
  • 全項目の文字数を合わせて最大10,000文字まで

翻訳可能なようです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした