Google翻訳は、Googleが無料で提供している翻訳サービスです。
Google翻訳からはAPIが公開されており、開発者はこのAPIを利用することで簡単に翻訳機能をアプリケーションに組み込むことができます。
今回は、AndroidアプリケーションからこのGoogle翻訳APIを利用する方法について解説したいと思います。
翻訳APIは、特定のURLに対して決められたフォーマットでリクエストを送信することで利用できます。
翻訳APIを利用するポイントは以下の点です
・指定のURLに対してHTTPリクエスト(GET)を行う
・HTTPレスポンスを受け取る
・HTTPレスポンスの中身(JSON)を解析する
翻訳APIでは利用できる言語が限られており、利用できる言語を調べるためのAPIも用意されているので、それについても解説します。
また、今回はGoogleのAPIキーを必要とします。APIキーの取得方法については、以下の記事を参考にしてください。
Google App EngineでURL短縮サービスAPIを利用する
※2013/02/06 追記※
Google翻訳APIは有償に変更されました。
100万文字あたり20$の課金が必要です。ご注意ください。
https://developers.google.com/translate/v2/pricing?hl=ja
それでは続きから詳細をどうぞ
Google翻訳の概要
まずはGoogle翻訳の概要を、下図を参考に簡単に解説します。
冒頭でも述べましたが、Google翻訳APIは、特定のURLに対してHTTPリクエスト(GET)を送信することで利用できます。
①まず、端末にて指定のフォーマットでURLを生成します。
URLを生成するのに必要なものは以下の4点です。
- 送信先URL(https://www.googleapis.com/language/translate/v2?)
- APIキー(取得方法は後ほど解説)
- 翻訳元(source)の言語(今回のサンプルでは日本語)
- 翻訳先(target)の言語(今回のサンプルでは英語)
②URLを生成したら、HTTPリクエストを行うことでAPIにアクセスします。
HTTPメソッドにはGETを用いるようにします。
③翻訳自体はGoogle側のサーバーが行ってくれます。
④サーバーからHTTPレスポンスを受け取り、内容を取り出します。
レスポンスの内容はJSON形式になっているので、あとはそれを解析し、翻訳後の文字列だけを取り出します。
以上がAPI利用の簡単な流れになります。
翻訳APIで翻訳を行う
それでは早速ソースコードの方を見ていきます。
まずはAPIにアクセスするためのURLの生成を行っている部分を以下に示します。
TransrateActivity.java
String baseUrl = "https://www.googleapis.com/language/translate/v2?key="; String srcLang = "&source=ja"; String targetLang = "&target=en"; String transChar = "&q=" + "私達は技術者集団Techboosterだ。"; String Url = baseUrl + srcLang + targetLang + transChar;
1行目のbaseUrlは、送信先のURLを定義しています。「Key=」の後にAPIキーを指定する必要があります。
2行目では翻訳元の言語(source)を定義しています。今回は日本語→英語と翻訳を行いたいので、sourceに「ja(日本語)」を指定します。
3行目では翻訳先の言語(target)を定義しています。今回は「en(英語)」を指定します。
4行目では翻訳したい文字列を定義しています。今回は「私達は技術者集団Techboosterだ。」を英語に翻訳してみたいと思います。
最後に6行目で定義したすべての文字列を合体して最終的にHTTPリクエストを行うURLを生成します。すると以下のようなURLができあがります。
「https://www.googleapis.com/language/translate/v2?key=[APIキー]&source=ja&target=en&q=私達は技術者集団Techboosterだ。」
さて、URLは生成できたので、あとはこのURLを利用してHTTPリクエストを行います。
HTTPのGETメソッドにてHTTPリクエストを行う方法については以下の記事を参考にしています。
DefaultHttpClientを使ってコンテンツを取得する
TransrateActivity.java
String Url = baseUrl + srcLang + targetLang + transChar; HttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(Url); HttpResponse httpResponse = null; try { httpResponse = httpClient.execute(request); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } int status = httpResponse.getStatusLine().getStatusCode(); if (status == 200){ // HTTPレスポンスから値を取り出す ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { httpResponse.getEntity().writeTo(outputStream); } catch (IOException e) { e.printStackTrace(); } tv.setText(outputStream.toString()); }
まずは4行目で、HTTPでGETを行うためのHttpGetクラスのインスタンスを生成しています。
引数には、先ほど生成したAPIにアクセスするためのURLを指定しています。
6行目では、HTTPリクエストを送信してHTTPレスポンスを得るためのHttpResponseクラスのインスタンスを生成しています。
3行目で生成したHttpClientクラスのインスタンスからexecuteメソッドを実行することで、HTTPリクエストを行います。
4行目で生成したHttpGetクラスのインスタンスを引数に渡すことで、指定のURLに対してGETメソッドでのHTTPリクエストを行います。
8行目で、HttpClientクラスのexecuteメソッドを実行してHTTPレスポンスを取得しています。
15行目でHTTPResponseクラスのオブジェクトからステータスを取り出します。
16行目で、HTTPレスポンスのステータス判定を行い、ステータスが「200(OK)」だった場合には、HTTPレスポンスから値を取り出しています。
25行目で、取得した値をTextViewに表示しています。(※この辺りの詳しい解説はDefaultHttpClientを使ってコンテンツを取得するを参考にしてください)
すると下図のようなJSON形式の値が得られます。
{ "data":{ "translations":[ { "translatedText":"Our technician is Techbooster population." } ] } }
このままではわかりづらいので、JSONを解析して目的の翻訳後の文字列だけ取り出してみます。
まずは以下がそのソースコードになります。
TransrateActivity.java
// JSONの解析 try { JSONObject rootObj = new JSONObject(outputStream.toString()); JSONObject value = rootObj.getJSONObject("data"); JSONArray transArray = value.getJSONArray("translations"); for (int i=0; i < transArray.length(); i++) { JSONObject obj = transArray.getJSONObject(i); translated = obj.getString("translatedText"); } } catch (JSONException e) { e.printStackTrace(); } tv.setText(translated);
JSONの解析方法については、以下の記事を参考にしています。
JSONをパース(解析)する
先ほどのJSONを見ながら、目的の値を取り出す流れを見ていきましょう。
まず3行目で、JSONObjectクラスのインスタンスを取得します。このオブジェクトを辿って目的の値を探します。
4行目でJSONObjectクラスのgetJSONObjectメソッドを用いて、キー”data”に割り当てられたJSONObject型の値(value)を取得しています。
5行目で、JSONObjectクラスのgetJSONArrayメソッドを用いて、”value”からキー”translations”に割り当てられたJSONArray型の値(transArray)を取得しています。
6〜9行目でtransArrayを捜査し、キー”translatedText”に割り当てられた値を取得しています。
この“translatedText”のキーに割り当てられた値が、今回取得したい翻訳後の文字列になります。
最後に13行目で、得られた文字列をTextViewに表示することで、以下のように翻訳後の文字列だけが表示されます。
翻訳に使用できる言語情報を取得する
次に、Google翻訳で利用できる言語の一覧を取得してみたいと思います。
手順は先ほどとほとんど同様で、特定のURLにHTTPのGETメソッドでアクセスするだけです。
UsableLanguage.java
public class UsableLanguage extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.access); super.onCreate(savedInstanceState); HttpClient httpClient = new DefaultHttpClient(); String Url = "https://www.googleapis.com/language/translate/v2/languages?key="; String usableLang = "利用可能言語一覧" + "\n"; HttpGet request = new HttpGet(Url); (...前述のソースコードと同様のため省略...) if (status == 200){ // JSONの解析 try { JSONObject rootObj = new JSONObject(outputStream.toString()); JSONObject value = rootObj.getJSONObject("data"); JSONArray transArray = value.getJSONArray("languages"); for (int i=0; i < transArray.length(); i++) { JSONObject obj = transArray.getJSONObject(i); usableLang += obj.getString("language") + "\n"; } } catch (JSONException e) { e.printStackTrace(); } tv.setText(usableLang); } } }
ソースコード自体は先ほどとほとんど同じですので解説は省略しますが、注目すべきは7行目で定義した以下のURLです。
“https://www.googleapis.com/language/translate/v2/languages?key=[APIキー]”
このURLに対して、先ほどと同様、GETメソッドを用いたHTTPリクエストを行うと、以下のようなJSON形式のレスポンスが得られます。
{ "data":{ "languages":[ { "language":"af" }, { "language":"ar" }, { "language":"be" }, (...省略...) { "language":"zh" }, { "language":"zh-TW" } ] } }
これを先ほどと同様の手順で8〜14行目で示すようにJSON解析を行うと、以下のような言語コードの一覧が得られます。
これら言語コードに含まれる言語であれば、Google翻訳APIを用いて翻訳を行うことができます。
Google翻訳APIを有効にする
最後に、Google翻訳APIを有効にする方法について触れておきます。
Google翻訳APIは、APIs Consoleから有効にできます。(APIs ConsoleについてはGoogle App EngineでURL短縮サービスAPIを利用する参照)
下図のように、「Translate API」をONにしてください。OFFのままHTTPリクエストを行っても、ネットワークエラーがJSONで返ってくるだけで、翻訳は行ってくれません。
Google翻訳の利用方法についての解説は以上です。おつかれさまでした。