yonet77的な雑記帳

日々思いついたネタなどを書き留めておきます

Microsoft Translator APIを使ってみたよ (1)

Microsoft Translator APIを使って、翻訳コンニャク機能を試してみました。

Microsoft Translator APIって??

翻訳コンニャクしてくれるAPIです。
Microsoft Translator | Windows Azure Marketplaceがそのものなので、詳細はリンク先を参照下さい。
翻訳APIを公開しているところでは、Googleさんもあります。ただ、無償プランがなくなった模様ですので、Microsoftさんを使わせて頂いた次第です。
とはいっても、無償プランは 2,000,000 文字/月 と制限はあります。
2,000,000文字以降は有償プランが用意されています。


下準備(アカウントの作成など)

  1. Windows Live IDの取得 (適当にお願いします)
  2. Microsoft Translator サブスクリプションの登録 (コチラから)
  3. アプリケーションの登録 (コチラ)から

といったモノが必要となります。

ココで1点ハマったのが、アプリケーションの登録でした。。
f:id:yonet77:20121104145606j:plain

クライアントIDには何か適当な名前を入れておけば良いのかなーと思いきや、自身のアカウントの「顧客ID」を指定しておく必要があるようです。。
MSDNのリファレンスにも始めからそう書いておいて欲しかった....(苦笑)
参考


ともあれ、これで"Client ID"と"Client Secret"を取得すればOKです。

この他に、Salesforce側でリモートサイトの設定をしておくと良いでしょう。
f:id:yonet77:20121104170808p:plain


Access Tokenを取得する

一応リファレンスもあるので、ココを参照するのがベストです。
とはいっても、さすがマイクロソフト...と言わんばかりに、サンプルはC#だったりと。。

そんなわけで、Force.com上でどうやって実装してみようか?というのがこんなサンプルです。。

Javascript RemoteActionで定義しているのは、個人的な好みです。
単に、RemoteAction内からHTTPコールアウトを使って、AccessTokenを取得しにいって、その結果をAccessToken保持用のApexクラスに渡しているだけです。

※なお、jQueryで取得するのもアリかと思いますが、クロスドメインになるあたりがやっかいかと思います。jQuery + JSONPの組合せでうまくできるかなー...と思いますが、またの機会に試してみようかと。。


Translator APIを利用する

さてようやくAPIを使って翻訳してみましょうか。Translator APIは3種類のInterfaceが用意されています。

  1. SOAP Interface
  2. HTTP Interface
  3. AJAX Interface

ココでは、HTTP Interfaceを使ってみます。

Access Tokenを取得したときと同様に、HTTPコールアウトを使って、日本語を英語に翻訳してます。
ここでハマったのが、

token = token.replaceAll('&', '&');

という箇所でした。

AccessTokenを取得する処理にも関連してくるとは思いますが、ココでは受け取ったtoken内で「&」となって欲しいところが、

&

エンコードされてしまうので、無理矢理戻してます。。
※もっと良い方法があるかと思いますが、とりあえずこんな感じで処理しちゃってます。。うーむ..イマイチ。。

ココに気付かず、ずーっとこんなエラーメッセージが返ってくるので、(やや)気が狂いそうになりました。

Message: The Web Token must have a signature at the end. The incoming token did not have a signature at the end of the token.


さて、ココで上記のApexクラスを利用するVFPageを用意します。

ココでは、

  1. Access Tokenを取得するRemoteAction
  2. テキストを翻訳するRemoteAction

の2つを用意しておいて、Access Tokenが取得できたら、翻訳処理する、という流れになっています。

結果は
 ↓
f:id:yonet77:20121104162539p:plain


"Sunlight Yellow Over Drive"になっていないので、翻訳に失敗した模様です...
_| ̄|○

ちなみに、AddTranslationを使うと、翻訳を追加できるようです。


最後に

これの利用例について、簡単にメモしておきます。

あるカスタムオブジェクト内に

  • 日本語用テキスト項目
  • 英語用テキスト項目

を用意しておいて、どちらかを入力して翻訳用ボタンをポチると、もう片方のテキスト項目に翻訳結果がセットされる
といった例があるかと思います。

後は、以前にISV Force勉強会で見かけた記憶がありますが、Chatter Translatorに使ってみても良いかもしれません。

Chatter Translatorのサンプルとか、次回のネタにしても良いかもしれませんが全くの未定です。
ではでは〜