モチベーション
留学生が多い研究室は多くあると思います。
しかし、学生みんな英語がペラペラなわけではありませんよね?汗
そして、言語の壁はチャット上でも存在します。
大事なことはちゃんと英語に訳しますが
些細なことを英語にいちいち訳すのはおっくですよね。
そこで、翻訳コマンドがあったら
チャット上の言語の壁が少しでも小さくなるのでは?
と思っていました。
こんな感じ

英語は訳さない仕様です汗
Microsoft Translate API
上記の記事を見つけていたのですが

もう DataMarket は終わってしまうようだったのでした。
そこで、 Microsoft Cognitive Services の Translator API を使ってみることにしました。

無料枠の制限は同じです。
登録とか
ここ見ながら適当に登録して、 Translator Text API
の Free
のものを適当にやりました。

鍵とかアクセストークンとか
スブスクリプションキー

KEY1
と KEY2
が何なのかよくわかりませんが、とりあえず KEY1
だけでできました。
アクセストークン
上の鍵と入れて Try it out!
してみてください。
Response Body
にトークンが返ってきてると思います。

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

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 に翻訳後のテキストを返すようにしておけば出来上がりですね。

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