Allora, ho aggiustato un po' il codice e l'ho commentato(penso abbastanza per capirlo), se non lo capite o trovate bug(non l'ho testato molto), postate pure. Ho introdotto anche il supporto per caratteri speciali e la traduzione di stringhe multilinea.
Ho creato un'applicazione form con un button1 e una textbox1 multilinea, per provarlo basta creare gli oggetti prima citati nel form e poi copiare ed incollare i codici sorgenti scritti sotto nel proprio progetto
form1.vb
codice:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'inizializzo un oggetto GoogleTranslateAPI
Dim Translate As New GoogleTranslateAPI("Testo da tradurre di prova.èé+*{}ò°@ù§" + vbCrLf + "Jake è il migliore", "it", "en") 'primo campo:testo da tradurre; secondo e terzo campo:lingua iniziale, lingua finale
Do While Translate.loading = True 'Fino a quando la traduzione non è pronta il ciclo continua
Application.DoEvents() 'l'applicazione non si blocca mentre aspetta la traduzione
GoogleTranslateCompleted(Translate.getResponse())
Loop
End Sub
''' <summary>
''' Evento: Quando la traduzione è pronta viene richiamata questa subroutine dove si può
''' </summary>
''' <param name="traduzione"></param>
''' <remarks></remarks>
Sub GoogleTranslateCompleted(ByVal traduzione As String)
TextBox1.Text = traduzione
End Sub
End Class
GoogleTranslateAPI.vb
codice:
' Jake7zDunn [2014]
' GoogleTranslate.vb è una classe per applicazioni .NET che permette di usare il famoso servizio di Google
' per tradurre testi da una lingua all'altra.
' La classe è stata scritta a scopo unicamente informativo, Jake7zDunn non si assume nessuna responsabilità
' sull'uso che se ne farà.
Imports System.Net.WebUtility 'Codifica URL caratteri speciali
Imports System.Windows.Forms 'WebBrowser
Imports System.Text.RegularExpressions 'Regex
Public Class GoogleTranslateAPI
Friend WithEvents wb As New WebBrowser 'Dichiaro un nuovo WebBrowser
Private response As String = Nothing 'Dichiaro una stringa response in cui verrà depositata la traduzione
Public loading = True 'Serve come """evento""" per avere la possibilità di sapere se la traduzione è pronta
''' <summary>
''' Costruttore oggetto GoogleTranslate (Inizializza anche la richiesta per la traduzione)
''' </summary>
''' <param name="text">Testo da tradurre</param>
''' <param name="lingua1">Parametro per indicare la lingua iniziale</param>
''' <param name="lingua2">Parametro per indicare la lingua finale</param>
''' <remarks></remarks>
Sub New(ByVal text As String, ByVal lingua1 As String, ByVal lingua2 As String)
wb.ScriptErrorsSuppressed = True
translate(text, lingua1, lingua2)
End Sub
''' <summary>
''' Inizializza la richiesta http per ottenere la traduzione
''' </summary>
''' <param name="text">Testo da tradurre</param>
''' <param name="lingua1">Parametro per indicare la lingua iniziale</param>
''' <param name="lingua2">Parametro per indicare la lingua finale</param>
''' <remarks></remarks>
Public Sub translate(ByVal text As String, ByVal lingua1 As String, ByVal lingua2 As String)
loading = True
Try
wb.Navigate(getUrl(text, lingua1, lingua2))
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
''' <summary>
''' Evento: Pagina Google Translate finisce di caricare
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted
Do 'Aspetta che il codice javascript processi la traduzione
Application.DoEvents() 'intanto l'applicazione continua a funzionare
If wb.Document.DomDocument.body.outerhtml.contains("class=""hps""") Then 'quando viene caricata la traduzione
setResponse(wb.Document.GetElementById("result_box").OuterHtml) 'ottiene la traduzione sotto forma di html che viene processata da setResponse
loading = False
Exit Do
End If
Loop
End Sub
''' <summary>
''' Pulisce la traduzione dal codice html e la salva nella variabile globale response.
''' </summary>
''' <param name="html">Traduzione sotto forma di html</param>
''' <remarks></remarks>
Private Sub setResponse(ByVal html As String)
html = html.Replace(" <br>", vbCrLf) 'inserisce i caratteri di fine linea
response = Regex.Replace(html, "<[^>]*>", "") 'pulisce la traduzione dal codice html tramite le espressioni regolari
End Sub
''' <summary>
''' Ottiene il link da richiedere per ottenere la traduzione
''' </summary>
''' <param name="text">Testo da tradurre</param>
''' <param name="lingua1">Parametro per indicare la lingua iniziale</param>
''' <param name="lingua2">Parametro per indicare la lingua finale</param>
''' <returns></returns>
''' <remarks></remarks>
Private Function getUrl(ByVal text As String, lingua1 As String, ByVal lingua2 As String) As String
MsgBox(encodeGoogleLink(text))
Return "http://translate.google.it/#" + lingua1 + "/" + lingua2 + "/" + encodeGoogleLink(text)
End Function
''' <summary>
''' Ottiene la traduzione :) :)
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function getResponse() As String
Return response
End Function
''' <summary>
''' Sostituisce il carattere di ritorno a capo con il carattere esadecimale necessario nei link http
''' </summary>
''' <param name="text"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function encodeGoogleLink(ByVal text As String)
Return UrlEncode(text).Replace("+", "%20").Replace("%0D%0A", "%0A") 'codifica il testo per i caratteri speciali
End Function
End Class