More than 1 year has passed since last update.

モチベーション

留学生が多い研究室は多くあると思います。
しかし、学生みんな英語がペラペラなわけではありませんよね?汗

そして、言語の壁はチャット上でも存在します。
大事なことはちゃんと英語に訳しますが
些細なことを英語にいちいち訳すのはおっくですよね。

そこで、翻訳コマンドがあったら
チャット上の言語の壁が少しでも小さくなるのでは?
と思っていました。

こんな感じ

Screen Shot 2016-12-06 at 19.25.09.png

英語は訳さない仕様です汗

Microsoft Translate API

上記の記事を見つけていたのですが

Screen Shot 2016-12-06 at 19.33.19.png

もう DataMarket は終わってしまうようだったのでした。

そこで、 Microsoft Cognitive Services の Translator API を使ってみることにしました。

Screen Shot 2016-12-06 at 19.40.30.png

無料枠の制限は同じです。

登録とか

ここ見ながら適当に登録して、 Translator Text APIFree のものを適当にやりました。

translate_api_overview.png

鍵とかアクセストークンとか

スブスクリプションキー

translate_api_key.png

KEY1KEY2 が何なのかよくわかりませんが、とりあえず KEY1 だけでできました。

アクセストークン

http://docs.microsofttranslator.com/oauth-token.html

上の鍵と入れて Try it out! してみてください。
Response Body にトークンが返ってきてると思います。

Screen Shot 2016-12-06 at 20.30.45.png

API 一覧

http://docs.microsofttranslator.com/text-translate.html

あとはここを叩くだけです。

Screen Shot 2016-12-06 at 20.34.14.png

Google Apps Script

doPost

ウェブアプリケーションとして公開するために doPost 関数か、 doGet 関数を用意します。

function doPost(e) {
  if(e.parameter.token != SLACK_OUTGOING_TOKEN) return null;

  var command = e.parameters.text[0].split(" ");
  command.shift();
  var text = command.join(" ");
  var translated = translate(text);
  return postToSlack( SECRETARY, "#" + e.parameters.channel_name[0], translated);
}

translate

実際に 翻訳APIを叩いているところです。
Detect も使って、テキストが何語なのかも判別しています。

function translate(text) {
  var subscription_key = "<さっきの鍵>";
  var token_url = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken";
  var token_options = {
   "method": "post",
   "headers": {
     "Accept": "application/jwt",
     "Ocp-Apim-Subscription-Key": subscription_key
   }
  };
  var access_token = UrlFetchApp.fetch(token_url, token_options).getContentText("UTF-8");

  var detect_url = "http://api.microsofttranslator.com/v2/Http.svc/Detect?text=" + encodeURIComponent(text);
  var translate_options = {
    "headers": {
      "Authorization": "Bearer " + access_token
    }
  };
  var language_xml = UrlFetchApp.fetch(detect_url, translate_options).getContentText();
  // <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">en</string>
  var language = XmlService.parse(language_xml).getRootElement().getText();

  var from = "ja";
  var to = "en";

  if (language.indexOf("ja") >= 0) {
    Logger.log("日本語です");
    from = language;
  } else if (language.indexOf("zh") >= 0) {
    Logger.log("中国語です");
    from = language;
  } else {
    Logger.log("英語です");
    return "You should read it in English. (-_-;";
  }

  var translate_url = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=" + from + "&to=" + to + "&text=" + encodeURIComponent(text);
  var translated_xml = UrlFetchApp.fetch(translate_url, translate_options).getContentText();
  var translated = XmlService.parse(translated_xml).getRootElement().getText();
  return translated;
}

日本語、中国語以外は全て英語としてしまうくそ仕様ですが。。

公開

公開したURLをSlackのoutgoing webhook に指定して、incoming webhook に翻訳後のテキストを返すようにしておけば出来上がりですね。

Screen Shot 2016-12-06 at 20.45.33.png

所感

まあチャット言葉の翻訳は難しいですね。。。

Screen Shot 2016-12-06 at 20.48.09.png