In questo articolo, presentiamo una libreria java molto utile, da utilizzare nelle nostre applicazioni Java, sia Web, sia Desktop, per fornire una traduzione di qualsiasi testo. Grazie alle Google Translate API, possiamo interfacciarci al traduttore di Google, che, anche se non sempre preciso, è molto semplice da usare.
Possiamo scaricare la libreria dal sito ufficiale. Al momento l'ultima versione sviluppata è la 0.6.
Naturalmente Google ha impostato delle limitazioni sull'utilizzo del servizio, quindi occorre evitare di sovraccaricare il server di richieste, pena il "ban" (l'esclusione) dell'indirizzo IP.
L'esempio che esaminiamo, è costituito da una semplice pagina JSP, nella quale l'utente potrà impostare la lingua di origine, il testo da tradurre e, naturalmente, la lingua in cui il testo deve essere tradotto, e da una servlet che richiamerà la libreria per tradurre il testo.
<%@page import="com.google.api.translate.Language"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Google Translator API</title></head> <body> <% StringBuffer lingueOption = new StringBuffer(); Language[] lingueDisponibili = Language.values(); for (int i = 0; i < lingueDisponibili.length; i++) lingueOption.append("<option value="" + lingueDisponibili[i].name() + "">" + lingueDisponibili[i].name() + "</option>"); %> <form action="translator" method="post"> <table> <tr> <td>Lingua origine</td> <td> <select name="linguaIn"> <option>[Seleziona]</option> <%=lingueOption%> </select> </td> </tr> <tr> <td>Lingua destinazione</td> <td> <select name="linguaOut"> <option>[Seleziona]</option> <%=lingueOption%> </select> </td> </tr> <tr> <td colspan="2"> <textarea rows="10" cols="150" name="testo"></textarea> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="Traduci" /> </td> </tr> </table> </form> </body> </html>
Utilizzando il metodo statico values()
della classe com.google.api.translate.Language
, otteniamo l'elenco di tutte le lingue disponibili, con il quale prepopoliamo i menù a tendina della maschera.
package it.html.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.api.translate.Language; import com.google.api.translate.Translate; public class TranslatorServlet extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String linguaIn = req.getParameter("linguaIn"); String linguaOut = req.getParameter("linguaOut"); String testo = req.getParameter("testo"); try { Language in = Language.valueOf(linguaIn); Language out = Language.valueOf(linguaOut); String translatedText = Translate.translate(testo, in, out); req.setAttribute("testoTradotto", translatedText); } catch (Exception ex) { ex.printStackTrace(); req.setAttribute("testoTradotto", "Impossibile tradurre il testo"); } RequestDispatcher rd = getServletContext().getRequestDispatcher("/traduzione.jsp"); rd.forward(req,resp); } }
Nella Servlet, acquisiamo i parametri impostati dall'utente nella maschera precedente, e mediante il metodo statico valueOf(String)
della classe com.google.api.translate.Language
, otteniamo le istanze della classe Language
, rispettivamente della lingua di origine e della lingua di destinazione.
Tali instanze vanno passate, insieme al testo da tradurre, al metodo translate(String, Language, Language)
della classe omonima com.google.api.translate.Translate
. La classe ci restituirà il testo tradotto.
Infine passiamo il risultato alla pagina traduzione.jsp
dove stamperemo il testo tradotto o l'eventuale messaggio di errore.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Google Translator API</title></head> <body> <h2>Testo tradotto</h2> <div> <%= request.getAttribute("testoTradotto") != null ? request.getAttribute("testoTradotto") : "" %> </div> <br /> <a href="index.jsp">Torna indietro</a> </body> </html>
Naturalmente per testare l'applicazione è necessario avere una connessione internet attiva. In caso contrario la libreria non riuscirà a raggiungere il sevizio google e genererà la seguente eccezione:
java.lang.Exception: [google-api-translate-java] Error retrieving translation. at com.google.api.translate.Translate.retrieveTranslation(Translate.java:104) at com.google.api.translate.Translate.translate(Translate.java:71) ….. Caused by: java.net.NoRouteToHostException: No route to host: connect at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) at com.google.api.translate.Translate.retrieveTranslation(Translate.java:98) ...