# Google Translate über Java ansprechen?



## Mc Noise (9. Mai 2010)

HI Leute,

Ich würde gerne Google Translate über Java ansprechen, das heißt ich möchte einen String übergeben können und die Übersetzung dann als Rückgabewert bekommen. Ganz wichtig ist, das ich keine externen APIs verwenden möchte, was heißt, dass ich alles alleine schreiben muss/will 

Leider habe ich keine Ahnung wie man da ran gehen könnte, und das Kapitel über Netzwerkprogrammierung beim Galileo OpenBook hat mich auch nciht weitergebracht.

Ich hoffe ihr könnt mir irgendwie helfen. Danke!


----------



## eRaaaa (9. Mai 2010)

Du willst Google Translate über Java nutzen aber ohne externe API ? ???:L
Naja, mit der API wäre das sicherlich alles etwas einfacher, aber ganz ohne wäre eine Idee evtl .so etwas:


```
String german = "hallo%20welt"; //suchstring leerzeichen durch %20 ersetzen!
		Scanner sc = new Scanner(new URL("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=de|en&q="+ german).openStream()); //de|en = deutsch --> englisch
		String tmp = sc.nextLine(); //hier kommt ein json string zurück
```

in tmp würde jetzt ein JSON String stehen. Auch hier wäre es vom Vorteil eine JSON-Lib zu nutzen, aber wenn du da auch ganz ohne Lib auskommen willst, musste den String halt selbst irgendwie auseinander nehmen, evtl. mit Regex!
Oder ganz häßlich mit substring so ^^:

```
String english = tmp.substring(tmp.indexOf("translatedText\":\"")+17, tmp.indexOf("\"responseDetails")-4);
		System.out.println(english);
```



Gibts einen Grund wieso du die google translate api nicht nutzen willst?


----------



## XHelp (9. Mai 2010)

Ich habe keine Ahnung, ob es nicht sowas wie GoogleTranslateAPI gibt, aber im notfall, kannst du einfach eine http Anfrage schicken und die Seite dann parsen, z.B.:


```
http://translate.google.com/?sl=en&tl=de&text=Just%20a%20simple%20test
```

Die Übersetzung steht dann innerhalb eines span's mit der id "result_box"


----------



## Mc Noise (9. Mai 2010)

Danke euch erstmal, genau so habe ich mir das vorgestellt 

@XHelp: Kannst du das vll. nochmal genauer beschreiben, mit Html Zeugs und Webseiten bin ich leider nicht sehr bewandert


----------



## Mc Noise (9. Mai 2010)

@eRaaaa: Ich möchte keine weiteren APIs verwenden, um weitere Abhängigkeiten zu sparen. Ich möchte einfach nicht für alles noch ein Paket mitliefern  Außerdem ist der Lerninhalt dann größer.

Ich habs jetzt so gemacht: 


```
/***************************************************************************
 *   Copyright (C) 2010 by MJ <mj_dv@web.de>                               *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

package translate;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

public class GoogleTranslate {

    public static String translate(Language from, Language to, String toTranslate) throws MalformedURLException, IOException {
        toTranslate = URLEncoder.encode(toTranslate, "utf-8");
        String str = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=" +
                from  + "|" + to + "&q="+ toTranslate;
        Scanner sc = new Scanner(new URL(str).openStream());
        str = sc.nextLine();
        
        return parseJSONString(str);
    }

    private static String parseJSONString(String str) {

        //check response status
        int index = str.indexOf("\"responseStatus\": ");
        index += "\"responseStatus\": ".length();

        String tmp = str.substring(index, str.length()-1);
        int status = new Integer(tmp);

        //TODO throw exception if status != 200
        if(status == 200) {
            index = str.indexOf("translatedText\":\"");
            index += "translatedText\":\"".length();

            tmp = str.substring(index, str.indexOf("\"}", index));
            return tmp;
        }
        return str;
    }

}
```

Ist das okay so?


----------



## eRaaaa (9. Mai 2010)

Mc Noise hat gesagt.:


> @eRaaaa: Ich möchte keine weiteren APIs verwenden, um weitere Abhängigkeiten zu sparen. Ich möchte einfach nicht für alles noch ein Paket mitliefern


 die beiden Libs wären zusammen nicht mal 100kb groß, aber okay 


> Außerdem ist der Lerninhalt dann größer.


:toll:


> Ist das okay so?



wenn`s läuft und du damit zufrieden bist ist es das ^^


----------



## Mc Noise (9. Mai 2010)

Joa also es funktioniert, also habe ich eigentlich nichts daran auszusetzen, aber du meintest ja das mit substring hässlich ist, also wollte ich nochmal nachfragen


----------



## FArt (10. Mai 2010)

Mc Noise hat gesagt.:


> Joa also es funktioniert, also habe ich eigentlich nichts daran auszusetzen, aber du meintest ja das mit substring hässlich ist, also wollte ich nochmal nachfragen



Ich glaube, dass der Ansatz häßlich ist ;-)

Eine API ist eine wohldefinierte Schnittstelle. Die Einbindung ist einfach. Dein Ansatz ist ein Wartungshorror.
Ich finde, der Lerneffekt ist größer, wenn man sich eine Aufgabe richtig löst. Mit Hacks hat man nichts gelernt.


----------



## Mc Noise (10. Mai 2010)

Dann sag mir wie mans besser machen könnte, ich bin ja für jede Hilfe sehr dankbar


----------



## FArt (10. Mai 2010)

Mc Noise hat gesagt.:


> Dann sag mir wie mans besser machen könnte, ich bin ja für jede Hilfe sehr dankbar



Habe ich doch schon... wenn es eine API gibt, dann benutze sie...


----------



## Mc Noise (10. Mai 2010)

Ja gibt es, aber wie gesagt möchte ich nicht!

Außerdem macht die API es nicht viel anders. Vielleicht kannst du nochmal genauer erklären was du so schlecht an diesem Ansatz findest. Besonders das mit der Wartungshölle versteh ich nicht ganz^^


----------



## tuxedo (26. Mai 2010)

*offtopic*



FArt hat gesagt.:


> Ich finde, der Lerneffekt ist größer, wenn man sich eine Aufgabe richtig löst. Mit Hacks hat man nichts gelernt.



Das kann man so oder so sehen. Am Lernziel ist man u.U. schneller wenn man erst gar keinen Hack versucht, sondern es, wie du schon sagst, gleich richtig macht.

Setzt man aber erstmal auf den Hack wird man früher oder später feststellen dass das eine doofe Entscheidung war und es dann richtig machen. Ergo: Auch hier das Lernziel erreicht.

Ich bin oft letzteren Weg gegangen. Und ich habs überlebt und auch daraus gelernt. Von daher sind 
wohl beide Wege nicht sooo verkehrt 

*/offtopic*


----------



## FArt (26. Mai 2010)

tuxedo hat gesagt.:


> *offtopic*
> 
> 
> 
> ...



Aus Erfahrung kann ich dazu nur zwei Bemerkungen anbringen, die nicht von mir stammen ...

1.) Wenn etwas erst mal läuft, dann wird es nicht mehr geändert. (oder nichts lebt länger als ein produktiver Prototpy)
2.) Wenn du jetzt keine Zeit hast es richtig zu machen, wann dann?


----------



## tuxedo (26. Mai 2010)

FArt hat gesagt.:


> Aus Erfahrung kann ich dazu nur zwei Bemerkungen anbringen, die nicht von mir stammen ...
> 
> 1.) Wenn etwas erst mal läuft, dann wird es nicht mehr geändert. (oder nichts lebt länger als ein produktiver Prototpy)
> 2.) Wenn du jetzt keine Zeit hast es richtig zu machen, wann dann?



Aus dem professionellen Umfeld heraus geb ich dir natürlich recht. Kunden eine "quick'n'dirty" Lösung zu verkaufen ist keine gute Idee. Diese Prototypen dann noch nach Jahren pflegen ist nicht mehr lustig,
Aber zur Hochschulzeit war das zumindest bei mir anders. Die "richtige" Lösung war meist mit einiger Einarbeitungszeit verbunden. Und wenn man noch am Anfang des Wissens steht, dann sieht man vieles anders und geht der vermeintlich einfacheren Weg. Und da stellt man früher (während der Entwicklungsphase) oder später (wenn es eigentlich schon zu spät ist) fest, dass es anders doch besser gewesen wäre und hat somit seine Lektion gelernt


----------

