こんにちは、えんぞーです。
普段から使ってる業務用アプリに「あ~、ここに翻訳ボタンあれば便利だな~・・コピペすんのめんどい」とか文句垂れていたので付けてみました。
とりあえず動いているので「同じような事したい人がいるかも知れない」ということで参考までにやり方書いときます。簡単に。
マイクロソフトのAccessを使用しているのでVBAでの記述となります。
必要なもの
必要というか下準備みたいなものですが・・・。
Microsoft Azure Marketplaceへの登録
API使うことになるのでWindows Azure Marketplaceへの登録が必要です。なんか難しそうな名前になってますけどWindowsLiveアカウントでOKです。
持っている人はそのままログインして、持っていない人は無料登録しておきましょう。
Microsoft Translator APIの登録
ここから翻訳APIの登録を行います。(もしくはログイン後の検索で探すと出てきます。)
下の画像のような画面になっているはずですので無料版で登録します。
(すでに押した後だったので画像は「キャンセル」と書いてますがこの位置です)
無料版は月に2,000,000文字の翻訳が可能となっています。
ちなみにログイン後のマイデータの項目で現在どのくらい使っているのかが確認できます。
アプリケーションの登録
ここからアプリケーションを登録します。
各項目の説明は次の通りです。
- クライアントID
既にされているID以外であれば好きなの付けて大丈夫です。 - 名前
好きなの入れてください。 - 顧客の秘密
アプリケーションのパスワード。自分の好きなパスワードにも出来ます。 - リダイレクト URI
このAPIでは不要っぽいですが必須らしいので適当に「http://localhost/」とか入れておく。httpsじゃないと・・・とか言われますが無視して大丈夫です。 - 説明
お好きな説明を入れてください。空でも大丈夫です。
Translator APIを使ってみる
ようやく本番です。
このAPIを使用する際の流れは、「access_tokenを取得する」→「翻訳する」という流れになるそうで。
まずはaccess_tokenを取得する為に指定されたURLへPOSTメソッドをつかってパラメーターを投げてやりましょう。
access_token取得に必要な各種パラメーター
・リクエストURL
https://datamarket.accesscontrol.windows.net/v2/OAuth2-13
・メソッド POST
・パラメーター
- grant_type
client_credentials - client_id
アプリケーションの登録時に指定したクライアント ID - client_secret
アプリケーションの登録時に取得した顧客の秘密 - scope
http://api.microsofttranslator.com
この部分をVBAでコードにしてみると
Dim xmlHttp As Object 'HTTPリクエストオブジェクト Dim url As String 'リクエストを送るURL Dim strParam As String 'リクエストパラメータ Dim strRes As String '結果を受け取る変数 Set xmlHttp = CreateObject("MSXML2.XMLHTTP") url = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13" strParam = "grant_type=client_credentials&client_id=クライアントID&client_secret=クライアントのパスワード(顧客の秘密)&scope=http://api.microsofttranslator.com" With xmlHttp .Open "POST", url, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .send (strParam) strRes = .responseText End With MsgBox strParam
これを実行するとJSON形式の返り値があるのであとはそこから「access_token」を抜き出します。
ポイントとすればRepuestHeaderには「application/x-www-form-urlencoded」を指定する所でしょうか。
あと、顧客のパスワード部分ですが最初に決められたものを使う場合は注意して下さい。文字列の中に「=」とか入っているとそれを考慮した書き方しないといけないかも知れません。
なんか上手くいかない・・・って言う場合はパスワードを英数字のみにして試して見てください。
JSON形式から「access_token」を取り出す
返り値取得出来たならあとは好きに料理してくれればOKって感じですがずぼらな私の場合でご紹介。
JSONからの取り出しはそれように関数作っちゃいました。
Function tokentype(jsonword As String) As String 'JSON渡すとaccess_token返す関数 Dim sc As Object Dim strFunc As String Dim objJSON As Object Set sc = CreateObject("ScriptControl") sc.Language = "JScript" 'jsonにパースする関数文字列 strFunc = "function jsonParse(s) { return eval('(' + s + ')'); }" '関数を追加 sc.AddCode strFunc '追加した関数を実行して、結果を変数に格納する Set objJSON = sc.CodeObject.jsonParse(jsonword) tokentype = objJSON.access_token Set objJSON = Nothing Set sc = Nothing End Function
これで「access_token」が入手出来たので、やっと翻訳作業に入れます。
翻訳してみる
翻訳はGETメソッドを使って行いました。
なにやらPOSTでも良いらしいっていうのも見た気がしますがGETでやって動いちゃったのでこれで良いです。
翻訳に必要なパラメーター
・リクエストURL
http://api.microsofttranslator.com/V2/Http.svc/Translate
・メソッド GET
・パラメーター
- from
翻訳元言語のコード - to
翻訳先言語のコード - text
翻訳するテキスト
あと先程取得したaccess_tokenをリクエストヘッダに組み込んであげればOK。
'この例だと英語から日本語に翻訳 url = "http://api.microsofttranslator.com/V2/Http.svc/Translate?from=en&to=ja&text=翻訳したい文" With xmlHttp .Open "GET", url, False .setRequestHeader "Authorization", "Bearer " & tokentype(strRes)'先述したJSON関数に最初の返り値をセットしたもの .send strRes = .responseText End With
リクエストヘッダに指定する際、"Authorization"をヘッダ名にして値に"Bearer "を入れてからaccess_tokenを入れると言うルールみたいです。
"Bearer"のあとに半角で 入っているので気を付けて下さい。
これで翻訳したものが返り値として帰ってきます。
後は自分の要望に合わせて翻訳メソッド自体を関数にしたりして自由に使えるかと思います。
私は単純に一行文の翻訳だけしたかったのでそのまま関数にして使ってます。
追記:日本語から英語へ翻訳するときの注意
コメント欄に頂いた質問(日本語→英語が文字化けしてしまう現象)が気になったので試してみました。KOJIさんありがとうございます^^
考えてみたら自分の場合「英→日」の翻訳しか必要なかったので「日→英」は試していませんでした。
結果、
見事に文字化けしました。
文字化けすると言う事は渡す文字列のエンコードに問題あるのでUTF-8にエンコードして渡せば・・・と言うことで下記のページでまとめられているようにエンコードする関数を用意しました。
文字列をUTF-8でエンコードするユーザー定義関数 | You Look Too Cool
注意点としては
VisualBasicエディタの設定をする必要があります。
ツール-参照設定-参照設定ダイアログで「Microsoft ActiveX Data Objects 2.8 Library」にチェックを入れます。
2.5以上であれば動くようです。
参照設定が必要になるのでそこを忘れないようにしてください。
肝心のコードはありがたくそのまま使わせて頂きます。
Function encodeUTF8(mytext As String) As String Dim mystream As New ADODB.Stream Dim mybinary, mynumber With mystream .Open .Type = adTypeText .Charset = "UTF-8" .WriteText mytext .Position = 0 .Type = adTypeBinary .Position = 3 mybinary = .Read .Close End With For Each mynumber In mybinary encodeUTF8 = encodeUTF8 & "%" & Hex(mynumber) Next End Function
この関数を使って再度試してみると・・・・
はい、正常に翻訳してくれました。
APIに渡す文字列はUTF-8にして渡す必要があるようです。
とりとめのないまとめ
1ヶ月で2,000,000文字もあれば十分過ぎるのでちょっと翻訳機能を組み込みたいっていう人にはオススメです。
今回はVBAでしたけど基本的にはどんな言語になっても一緒なので参考にはなるだろうと思います。
翻訳に頼らなくとも大丈夫なくらいの英語力があればそれで話は済むのですけれどもね(身も蓋も無い・・・)。