J'ai créé une application Android qui se traduit à l'aide de l'API MicrosoftTranslatorText, donc Je garderai un mémorandum de la méthode d'introduction. Dans cet article Traduction à l'aide de l'API Microsoft Translator Text sur Android-Preparation- En utilisant la clé obtenue dans, nous implémenterons la fonction de traduction dans l'application Android avec l'API MicrosofTranslatorText.
http://docs.microsofttranslator.com/text-translate.html#!/default/get_Translate
Pour traduire à l'aide de MicrosoftTranslatorTextAPI, vous devez d'abord obtenir un jeton API. Créez une classe qui hérite d'AsyncTask car elle communique.
TranslateAPIGetTokenRequest.java
package <nom du paquet>;
import android.os.AsyncTask;
import android.util.Log;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
public class TranslateAPIGetTokenRequest extends AsyncTask<String, Void, String>{
private static final String KEY = "<Clé API obtenue lors de la préparation>"; //Clé API
private static final String LOG_TAG = "GetTokenRequest"; //Balise de journal
private static final String HTTP_OK = "HTTP_OK"; //État de HttpUrlConnection
private String mTranslateWord = ""; //Texte traduit
private String mApiToken = ""; //Jeton API
private MainActivity mActivity; //Pour rappel
//constructeur
public TranslateAPIGetTokenRequest(MainActivity activity,String word){
mActivity = activity;
mTranslateWord = word;
}
@Override
protected String doInBackground(String... params) {
String urlStr = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; //URL de destination de la demande d'acquisition de jeton API
String result = null;
HttpURLConnection con;
URL url = null;
BufferedReader reader = null;
try{
url = new URL(urlStr);
}catch(Exception e){
e.printStackTrace();
}
try {
con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.addRequestProperty("Content-Type","application/json");
con.addRequestProperty("Ocp-Apim-Subscription-Key", KEY);
final int status = con.getResponseCode();
Log.d(LOG_TAG, "result:" + status);
if (status == HttpURLConnection.HTTP_OK) {
result= HTTP_OK;
StringBuilder stringBuilder = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = reader.readLine()) != null) {
stringBuilder.append(inputLine);
}
String recvData = stringBuilder.toString();
mApiToken = recvData;
Log.d(LOG_TAG, "http post success recvData: " + recvData);
} else{
result = String.valueOf(status);
}
}catch(Exception e){
Log.e(LOG_TAG,e.toString());
}
return result;
}
@Override
protected void onPostExecute(String result) {
Log.d(LOG_TAG, "onPostExecute, result: " + result);
//Le statut est HTTP_Si OK, lancez une demande de traduction
if(result.equals(HTTP_OK)) {
TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mApiToken);
trans.execute();
}else{
Log.d("GetTokenRequest", "onPostExecute:Error");
}
}
}
private static final String KEY = "<clé API obtenue en préparation>"; // clé API `
C'est parce que je souhaite spécifier le texte à traduire lors de l'appel depuis Activity.
//constructeur
public TranslateAPIGetTokenRequest(MainActivity activity,String word){
mActivity = activity;
mTranslateWord = word;
}
Les points de terminaison pour l'acquisition de jetons API sont les suivants. https://api.cognitive.microsoft.com/sts/v1.0/issueToken
String urlStr = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; //URL de destination de la demande d'acquisition de jeton API
Vous devez définir la clé API dans le paramètre Ocp-Apim-Subscription-Key.
Méthode de demande: POST Content-Type:application/json ** Ocp-Apim-Subscription-Key: clé API ** (clé obtenue en préparation)
con.setRequestMethod("POST");
con.addRequestProperty("Content-Type","application/json");
con.addRequestProperty("Ocp-Apim-Subscription-Key", KEY);
Si la demande aboutit, une chaîne d'environ 700 caractères sera renvoyée. C'est le jeton API.
if (status == HttpURLConnection.HTTP_OK) {
result= HTTP_OK;
StringBuilder stringBuilder = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = reader.readLine()) != null) {
stringBuilder.append(inputLine);
}
String recvData = stringBuilder.toString();
mTranslateToken = recvData;
Log.d(LOG_TAG, "http post success recvData: " + recvData);
} else {
result = String.valueOf(status);
}
À ce stade, spécifiez le jeton d'API, l'activité de destination de rappel et le texte traduit obtenu en 5 dans l'argument du constructeur.
@Override
protected void onPostExecute(String result) {
Log.d(LOG_TAG, "onPostExecute, result: " + result);
//Le statut est HTTP_Si OK, lancez une demande de traduction
if(result.equals(HTTP_OK)) {
TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mTranslateToken);
trans.execute();
}else{
Log.d("GetTokenRequest", "onPostExecute:Error");
}
}
Il semble absurde d'appeler la classe AsyncTask successivement comme ceci ...
Faites une demande de traduction à l'aide du jeton API obtenu en 1. Utilisez une classe qui hérite d'AsyncTask comme dans la demande d'acquisition de jeton API.
TranslateAPITranslateRequest.java
package <nom du paquet>;
import android.os.AsyncTask;
import android.util.Log;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class TranslateAPITranslateRequest extends AsyncTask<String, Void, String> {
private static final String LOG_TAG = "TranslateRequest"; //Balise de journal
private static final String HTTP_OK = "HTTP_OK";
private String mTranslateWord = "";//Texte non traduit
private String mTranslatedWord = ""; //Texte post-traduction
private String mApiToken = ""; //Jeton API
private MainActivity mActivity; //Activité de destination de rappel
//constructeur
public TranslateAPITranslateRequest(MainActivity activity,String word,String token){
Log.d(LOG_TAG,"word:" + word);
mActivity = activity;
mTranslateWord = word;
mApiToken = token;
}
@Override
protected String doInBackground(String... params) {
Log.d(LOG_TAG,"doInBackground,translateWord:" + mTranslateWord);
String urlStr = null;
try {
urlStr = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=ja&to=en&text=" + URLEncoder.encode(mTranslateWord, "UTF-8") ;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String result = null;
HttpURLConnection con;
URL url = null;
BufferedReader reader = null;
try{
url = new URL(urlStr);
}catch(Exception e){
e.printStackTrace();
}
try {
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.addRequestProperty("Authorization","Bearer " + mApiToken);
final int status = con.getResponseCode();
Log.d(LOG_TAG, "result:" + status);
if (status == HttpURLConnection.HTTP_OK) {
//Traitement pour recevoir une réponse, etc.
result=HTTP_OK;
StringBuilder stringBuilder = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = reader.readLine()) != null) {
stringBuilder.append(inputLine);
}
mTranslatedWord = stringBuilder.toString();
mTranslatedWord = mTranslatedWord.replace("<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">", "");
mTranslatedWord = mTranslatedWord.replace("</string>", "");
Log.d(LOG_TAG, "http post success recvData: " + mTranslatedWord);
} else{
result=String.valueOf(status);
}
}catch(Exception e){
Log.e(LOG_TAG, e.toString());
}
return result;
}
@Override
protected void onPostExecute(String result) {
Log.d(LOG_TAG, "onPostExecute, result:" + result);
if(result.equals(HTTP_OK)) {
mActivity.callback(MainActivity.CALLBACK_FINISH_TRANSLATE_CODE, mTranslatedWord);
}else{
Log.d(LOG_TAG, "onPostExecute:Error");
}
}
}
//constructeur
public TranslateAPITranslateRequest(MainActivity activity,String word,String token){
Log.d(LOG_TAG,"word:" + word);
mActivity = activity;
mTranslateWord = word;
mApiToken = token;
}
Le point final de la demande de traduction est le suivant. http://api.microsofttranslator.com/v2/Http.svc/Translate Les paramètres d'URL sont les suivants. text: le texte que vous souhaitez traduire. ** Obligatoire ** à: code de langue après traduction. ** Obligatoire ** from: Code de langue avant traduction. Tout appid: jeton API. ** Obligatoire, mais non obligatoire si paramètre d'en-tête: l'autorisation spécifie un jeton API. ** **
try {
urlStr = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=ja&to=en&text=" + URLEncoder.encode(mTranslateWord, "UTF-8") ;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Cette fois, nous traduirons du japonais vers l'anglais, nous avons donc spécifié from = ja et to = en. Le jeton API est ensuite spécifié dans le paramètre d'en-tête.
Méthode de requête: GET (Il existe une théorie selon laquelle il n'y a pas de problème avec POST) Autorisation: jeton API (*)
Voici le format du jeton API. ** "Porteur \ <jeton API >" ** Vous devez mettre un porteur sur la tête. ** Veuillez noter qu'il y a un espace demi-largeur entre le porteur et le jeton API. ** ** Ce format est également utilisé lorsque l'appid est spécifié dans le paramètre URL.
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.addRequestProperty("Authorization","Bearer " + mApiToken);
Si la demande aboutit, le résultat de la traduction sera renvoyé dans le format suivant.
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[Résultat de la traduction]</string>
Je souhaite renvoyer uniquement le résultat de la traduction, supprimez donc la partie inutile.
mTranslatedWord = stringBuilder.toString();
mTranslatedWord = mTranslatedWord.replace("<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">", "");
mTranslatedWord = mTranslatedWord.replace("</string>", "");
Assez forcé?
Si la communication réussit, le résultat de la traduction reçu sera rappelé à l'activité. J'utilise la fonction de rappel implémentée dans MainActivity.
@Override
protected void onPostExecute(String result) {
Log.d(LOG_TAG, "onPostExecute, result:" + result);
if(result.equals(HTTP_OK)) {
mActivity.callback(MainActivity.CALLBACK_FINISH_TRANSLATE_CODE, mTranslatedWord);
}else{
Log.d(LOG_TAG, "onPostExecute:Error");
}
}
Après cela, c'est OK si vous affichez le résultat de la traduction sur TextView etc. du côté Activité.
MainActivity.java
/**
*Méthode de rappel.
*Appelé une fois le traitement en arrière-plan terminé.
*/
public void callback(final int responseCode, String word) {
if (CALLBACK_FINISH_TRANSLATE_CODE == responseCode) {
translateResultText.setText(word);
}
}
Lors du démarrage de la traduction, décrivez comme suit dans Activité et commencez par l'acquisition du jeton API.
TranslateAPIGetTokenRequest trans = new TranslateAPIGetTokenRequest(MainActivity.this, [Le texte que vous souhaitez traduire]);
trans.execute();
J'ai essayé de traduire la chaîne de caractères entrée dans EditText pour voir à quel point elle était précise. Le texte est extrait de la documentation officielle de l'API Microsoft Translator.
De cette façon, le texte anglais du mot traduit est complètement différent.
Comme prévu, Google semble avoir une meilleure précision de traduction. Mais j'aimerais pouvoir le faire gratuitement!
C'est tout.
Recommended Posts