Ich habe eine Android-App erstellt, die mit der MicrosoftTranslatorText-API übersetzt Ich werde ein Memorandum über die Einführungsmethode aufbewahren. In diesem Artikel Übersetzen mit der Microsoft Translator Text API unter Android-Preparation- Mit dem in erhaltenen Schlüssel implementieren wir die Übersetzungsfunktion in der Android-Anwendung mit der MicrosofTranslatorText-API.
http://docs.microsofttranslator.com/text-translate.html#!/default/get_Translate
Um mit der MicrosoftTranslatorTextAPI zu übersetzen, müssen Sie zuerst ein API-Token erhalten. Erstellen Sie eine Klasse, die AsyncTask erbt, weil sie kommuniziert.
TranslateAPIGetTokenRequest.java
package <Paketnamen>;
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 = "<API-Schlüssel bei der Vorbereitung erhalten>"; //API-Schlüssel
private static final String LOG_TAG = "GetTokenRequest"; //Protokoll-Tag
private static final String HTTP_OK = "HTTP_OK"; //HttpUrlConnection-Status
private String mTranslateWord = ""; //Übersetzter Text
private String mApiToken = ""; //API-Token
private MainActivity mActivity; //Für Rückruf
//Konstrukteur
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"; //Ziel-URL für API-Token-Erfassungsanforderung
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);
//Der Status ist HTTP_Wenn OK, starten Sie eine Übersetzungsanforderung
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 = "<API-Schlüssel in Vorbereitung erhalten>"; // API-Schlüssel `
Dies liegt daran, dass ich den zu übersetzenden Text angeben möchte, wenn ich von Activity aus anrufe.
//Konstrukteur
public TranslateAPIGetTokenRequest(MainActivity activity,String word){
mActivity = activity;
mTranslateWord = word;
}
Die Endpunkte für den Erwerb von API-Token sind wie folgt. https://api.cognitive.microsoft.com/sts/v1.0/issueToken
String urlStr = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; //Ziel-URL für API-Token-Erfassungsanforderung
Sie müssen den API-Schlüssel im Parameter Ocp-Apim-Subscription-Key festlegen.
Anforderungsmethode: POST Content-Type:application/json ** Ocp-Apim-Abonnement-Schlüssel: API-Schlüssel ** (Schlüssel in Vorbereitung erhalten)
con.setRequestMethod("POST");
con.addRequestProperty("Content-Type","application/json");
con.addRequestProperty("Ocp-Apim-Subscription-Key", KEY);
Wenn die Anforderung erfolgreich ist, wird eine Zeichenfolge mit ca. 700 Zeichen zurückgegeben. Das ist das API-Token.
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);
}
Geben Sie zu diesem Zeitpunkt das API-Token, die Rückrufzielaktivität und den übersetzten Text an, die in 5 im Argument des Konstruktors erhalten wurden.
@Override
protected void onPostExecute(String result) {
Log.d(LOG_TAG, "onPostExecute, result: " + result);
//Der Status ist HTTP_Wenn OK, starten Sie eine Übersetzungsanforderung
if(result.equals(HTTP_OK)) {
TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mTranslateToken);
trans.execute();
}else{
Log.d("GetTokenRequest", "onPostExecute:Error");
}
}
Es scheint Unsinn, die AsyncTask-Klasse nacheinander so aufzurufen ...
Stellen Sie eine Übersetzungsanforderung mit dem in 1 erhaltenen API-Token. Verwenden Sie eine Klasse, die AsyncTask wie in der API-Token-Erfassungsanforderung erbt.
TranslateAPITranslateRequest.java
package <Paketnamen>;
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"; //Protokoll-Tag
private static final String HTTP_OK = "HTTP_OK";
private String mTranslateWord = "";//Nicht übersetzter Text
private String mTranslatedWord = ""; //Text nach der Übersetzung
private String mApiToken = ""; //API-Token
private MainActivity mActivity; //Rückrufzielaktivität
//Konstrukteur
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) {
//Verarbeitung zum Empfang von Antworten usw.
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");
}
}
}
//Konstrukteur
public TranslateAPITranslateRequest(MainActivity activity,String word,String token){
Log.d(LOG_TAG,"word:" + word);
mActivity = activity;
mTranslateWord = word;
mApiToken = token;
}
Der Endpunkt der Übersetzungsanforderung lautet wie folgt. http://api.microsofttranslator.com/v2/Http.svc/Translate Die URL-Parameter lauten wie folgt. Text: Der Text, den Sie übersetzen möchten. ** Erforderlich ** zu: Sprachcode nach der Übersetzung. ** Erforderlich ** von: Sprachcode vor der Übersetzung. Irgendein appid: API-Token. ** Erforderlich, aber nicht erforderlich, wenn Header-Parameter: Authorization gibt ein API-Token an. ** ** **
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();
}
Dieses Mal werden wir vom Japanischen ins Englische übersetzen, also haben wir von = ja und bis = en angegeben. Das API-Token wird dann im Header-Parameter angegeben.
Anforderungsmethode: GET (Es gibt eine Theorie, dass es kein Problem mit POST gibt) Autorisierung: API-Token (*)
Das folgende ist das Format des API-Tokens. ** "Inhaber \ <API-Token >" ** Sie müssen einen Träger auf den Kopf setzen. ** Bitte beachten Sie, dass zwischen dem Träger und dem API-Token ein Abstand von halber Breite besteht. ** ** ** Dieses Format wird auch verwendet, wenn die AppID im URL-Parameter angegeben ist.
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.addRequestProperty("Authorization","Bearer " + mApiToken);
Wenn die Anforderung erfolgreich ist, wird das Übersetzungsergebnis im folgenden Format zurückgegeben.
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[Übersetzungsergebnis]</string>
Ich möchte nur das Übersetzungsergebnis zurückgeben, also löschen Sie den unnötigen Teil.
mTranslatedWord = stringBuilder.toString();
mTranslatedWord = mTranslatedWord.replace("<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">", "");
mTranslatedWord = mTranslatedWord.replace("</string>", "");
Ganz gewaltsam?
Wenn die Kommunikation erfolgreich ist, wird das empfangene Übersetzungsergebnis zur Aktivität zurückgerufen. Ich verwende die in MainActivity implementierte Rückruffunktion.
@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");
}
}
Danach ist es in Ordnung, wenn Sie das Übersetzungsergebnis in TextView usw. auf der Aktivitätsseite anzeigen.
MainActivity.java
/**
*Rückrufmethode.
*Wird aufgerufen, nachdem die Hintergrundverarbeitung abgeschlossen ist.
*/
public void callback(final int responseCode, String word) {
if (CALLBACK_FINISH_TRANSLATE_CODE == responseCode) {
translateResultText.setText(word);
}
}
Wenn Sie mit der Übersetzung beginnen, beschreiben Sie Folgendes in Aktivität und beginnen Sie mit dem Erwerb des API-Tokens.
TranslateAPIGetTokenRequest trans = new TranslateAPIGetTokenRequest(MainActivity.this, [Der Text, den Sie übersetzen möchten]);
trans.execute();
Ich habe versucht, die in EditText eingegebene Zeichenfolge zu übersetzen, um festzustellen, wie genau sie tatsächlich war. Der Text stammt aus der offiziellen Dokumentation der Microsoft Translator-API.
Auf diese Weise ist der englische Text des übersetzten Wortes völlig anders.
Wie erwartet scheint Google eine höhere Übersetzungsgenauigkeit zu haben. Aber ich wünschte, ich könnte das kostenlos machen!
Das ist es.
Recommended Posts