Classe de traduction simplifiée/ traduction automatique d'un programme

Description

Cette classe simplifie au maximum la traduction d'un texte, ou de tous les contrôles du programme.
La partie traduction est un code de GILLARDG. J'en ait fait une classe plus simple d'utilisation en y ajoutant les fonctions suivantes:
  • Découpage du texte par paragraphe si il y a des sauts de lignes--> conservation des sauts de lignes et "presque" suppression de la limite de longueur imposée par google (Je part du principe qu'on traduit rarement un texte sans aucun saut de ligne, mais on pourrait améliorer ce point avec une traduction phrase par phrase)
  • Utilisation d'une énumération pour les langue afin de rendre l'utilisation plus intuitive.
  • Deux fonctions simplifiées:

-Traduction simple d'une string:
SYNTAXE: GoogleTranslation.TraductionGoogle(MonTexte, GoogleTranslation.Langue.Francais, GoogleTranslation.Langue.Anglais)
-Traduction de toute l'application:
SYNTAXE: GoogleTranslation.TraductionProjet_Google(GoogleTranslation.Langue.Francais, GoogleTranslation.Langue.Anglais)
  • Pour la traduction d'application je traduit tous les composants et formulaires qui ne sont pas dans des conteneurs. J'ai ajouté quand même la prise en charge du conteneur groupbox, vous pouvez facilement vous inspirer de l'exemple pour rajouter la prise en charge de n'importe quel conteneur.


SOURCES:
' Google AJAX Language API
' http://code.google.com/intl/fr/apis/ajaxlanguage/

' D'après :
' http://www.codeproject.com/KB/aspnet/Translate_Your_Website.aspx
' Avec la conversion en VB.Net :
' http://www.vbfrance.com/auteur/GILLARDG/1360034.aspx

Source / Exemple :


Public Class GoogleTranslation

    Public Enum Langue
        Anglais
        Allemand
        Espagnol
        Francais
        Italien
        ChinoisSimplifie
        ChinoisTraditionel
        Arabe
        Coreen
        Grec
        Hebreu
        Hindi
        Japonais
        Polonais
        Portuguais
        Roumain
        Russe
    End Enum

    Public Shared Function TraductionGoogle(ByRef TexteAtraduire As String, ByVal langueAvant As Langue, ByVal langueApres As Langue) As Boolean
        'cette étape a pour unique but de gérer les sauts de lignes, et d'augmenter la capacité en traitant le texte paragraphe par paragraphe.

        If TexteAtraduire.Contains(ControlChars.Lf) Then

            Dim success As Boolean = True
            Dim separateur As String = vbCrLf
            Dim paragraphes() As String
            paragraphes = TexteAtraduire.Split(ControlChars.Lf)
            For x = 0 To paragraphes.Length - 1
                If TraductionGoogleSimplification(paragraphes(x), langueAvant, langueApres) = False Then success = False
            Next
            TexteAtraduire = String.Join(vbCrLf, paragraphes)
            Return success
        Else
            'si aucun saut de ligne:
            Return TraductionGoogleSimplification(TexteAtraduire, langueAvant, langueApres)
        End If

    End Function

    Private Shared Function TraductionGoogleSimplification(ByRef TexteAtraduire As String, ByVal langueAvant As Langue, ByVal langueApres As Langue) As Boolean
        If langueApres = langueAvant Then Exit Function

        'VERIFICATION DE LA LONGUEUR DE TexteATraduire:
        If TexteAtraduire.Length > 999 Then
            TexteAtraduire = TexteAtraduire.Substring(0, 997)
            Try
                TexteAtraduire = TexteAtraduire.Substring(0, TexteAtraduire.LastIndexOf(".") + 1)
                TexteAtraduire = TexteAtraduire & "[…]"
            Catch ex As Exception
            End Try
        End If

        'APPEL DE LA FONCTION PRINCIPALE
        Dim sResult$ = ""
        Dim sMsgErr$ = ""
        Dim bVerifierDispo As Boolean = False
        If TraduireViaApiAjax(TexteAtraduire, interpreterLangue(langueAvant), interpreterLangue(langueApres), _
           sResult, sMsgErr, bVerifierDispo) Then
            TexteAtraduire = sResult
            Return True
        Else
            TexteAtraduire = sMsgErr
            If bVerifierDispo Then
                If My.Computer.Network.IsAvailable Then
                    ' Internet est pourtant dispo., c'est donc le site de Google qui ne l'est pas
                    TexteAtraduire = "Site de traduction google indisponible"
                End If
            End If
            Return False
        End If

    End Function

    Private Shared Sub TraductionFormulaire_Google(ByVal formulaire As Form, Optional ByVal langueDepart As Langue = Langue.Francais, Optional ByVal langueApres As Langue = Langue.Anglais)
        'fonction pour traduire un formulaire
        TraductionGoogle(formulaire.Text, langueDepart, langueApres)
        For Each objetTemporaire As Control In formulaire.Controls
            Try
                TraductionGoogle(objetTemporaire.Text, langueDepart, langueApres)
            Catch ex As Exception
            End Try
            If TypeOf objetTemporaire Is GroupBox Then
                Dim monConteneur As Control.ControlCollection = CType(objetTemporaire, GroupBox).Controls
                For Each sousControle As Control In monConteneur
                    Try
                        TraductionGoogle(sousControle.Text, langueDepart, langueApres)
                    Catch ex As Exception
                    End Try
                    My.Application.DoEvents()
                Next
            End If
            My.Application.DoEvents()
        Next
    End Sub

    Public Shared Sub TraductionProjet_Google(Optional ByVal langueDepart As Langue = Langue.Francais, Optional ByVal langueApres As Langue = Langue.Anglais)
        Try
            For Each Formulaire As Form In My.Application.OpenForms
                TraductionFormulaire_Google(Formulaire, langueDepart, langueApres)
                My.Application.DoEvents()
            Next
        Catch ex As Exception
        End Try

    End Sub

    Private Shared Function interpreterLangue(ByVal language As Langue) As String
        Select Case language
            Case Langue.Francais
                Return "fr"
            Case Langue.Anglais
                Return "en"
            Case Langue.Espagnol
                Return "es"
            Case Langue.Allemand
                Return "de"
            Case Langue.Italien
                Return "it"
            Case Langue.ChinoisSimplifie
                Return "zh(-CN)"
            Case Langue.ChinoisTraditionel
                Return "zh(-TW)"
            Case Langue.Coreen
                Return "ko"
            Case Langue.Grec
                Return "el"
            Case Langue.Hebreu
                Return "iw"
            Case Langue.Hindi
                Return "hi"
            Case Langue.Japonais
                Return "ja"
            Case Langue.Polonais
                Return "pl"
            Case Langue.Portuguais
                Return "pt"
            Case Langue.Roumain
                Return "ro"
            Case Langue.Russe
                Return "ru"
            Case Langue.Arabe
                Return "ar"
            Case Else
                Return "en"
        End Select
    End Function

    Private Shared Function TraduireViaApiAjax(ByVal stringToTranslate$, _
        ByVal fromLanguage$, ByVal toLanguage$, _
        ByRef sTrad$, ByRef sMsgErr$, ByRef bVerifierDispo As Boolean) As Boolean

        ' Google AJAX Language API
        ' http://code.google.com/intl/fr/apis/ajaxlanguage/

        ' D'après :
        ' http://www.codeproject.com/KB/aspnet/Translate_Your_Website.aspx
        ' Avec la conversion en VB.Net : 
        ' http://www.vbfrance.com/auteur/GILLARDG/1360034.aspx

        sMsgErr = ""
        sTrad = ""

        ' Make sure that the passed string is not empty or null
        If String.IsNullOrEmpty(stringToTranslate) Then
            sMsgErr = ""
            Exit Function
        End If

        ' Per google's terms of use, we can only translate
        '  a string of up to 5000 characters long
        ' En pratique c'est 1000 caractère, sinon : Net.HttpStatusCode.RequestUriTooLong
        If stringToTranslate.Length > 1000 Then
            sMsgErr = "String to translate must be less than 1000 characters long."
            Exit Function
        End If

        Const bufSizeMax As Integer = 65536
        Const bufSizeMin As Integer = 8192

        Try
            ' By default format? is text.  so we don't need to send a format? key
            Dim requestUri$ = _
                "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" & _
                stringToTranslate & "&langpair=" & fromLanguage & "%7C" & toLanguage

            ' Execute the request and get the response stream
            Dim request As Net.HttpWebRequest = _
                CType(Net.WebRequest.Create(requestUri), Net.HttpWebRequest)
            Dim response As Net.HttpWebResponse = _
                CType(request.GetResponse(), Net.HttpWebResponse)
            Dim responseStream As IO.Stream = response.GetResponseStream()

            ' Get the length of the content returned by the request
            Dim length As Integer = CInt(Fix(response.ContentLength))
            Dim bufSize As Integer = bufSizeMin

            If length > bufSize Then
                If length > bufSizeMax Then
                    bufSize = bufSizeMax
                Else
                    bufSize = length
                End If
            End If

            ' Allocate buffer and StringBuilder for reading response
            Dim buf(bufSize - 1) As Byte
            Dim sb As New System.Text.StringBuilder(bufSize)

            ' Read the whole response
            length = responseStream.Read(buf, 0, buf.Length)
            Do While length <> 0
                sb.Append(System.Text.Encoding.UTF8.GetString(buf, 0, length))
                length = responseStream.Read(buf, 0, buf.Length)
            Loop

            ' The format of the response is like this
            ' {"responseData": {"translatedText":"¿Cómo estás?"}, "responseDetails": null, "responseStatus": 200}
            ' so now let's clean up the reponse by manipulating the string
            Dim translatedText$ = ""
            ' En cas d'échec :
            ' "{"responseData": null, "responseDetails": "invalid language pair", "responseStatus": 400}"
            Dim sResult$ = sb.ToString()
            Const sGm$ = """"
            Const sTagEchec$ = "{" & sGm & "responseData" & sGm & ": null"
            If sResult.StartsWith(sTagEchec) Then
                'Dim asChamps$() = sResult.Split(","c)
                sMsgErr = sResult
                bVerifierDispo = False
            Else
                If sb.Length >= 36 Then
                    translatedText = sb.Remove(0, 36).ToString()
                Else
                    translatedText = sResult
                End If
                Dim iPos% = translatedText.IndexOf("""},")
                If iPos > -1 Then translatedText = translatedText.Substring(0, iPos)
                ' Remplacer les apostrophes
                sTrad = translatedText.Replace("\u0026#39;", "'")
                sTrad = sTrad.Replace("\u0026quot;", sGm) ' Et les guillemets
                Return True
            End If

        Catch ex As Net.WebException
            sMsgErr = "Erreur : " & ex.Message
            bVerifierDispo = True
            Try
                Dim response As Net.HttpWebResponse = _
                    CType(ex.Response, Net.HttpWebResponse)
                If response.StatusCode = Net.HttpStatusCode.RequestUriTooLong Then
                    sMsgErr = "Erreur : Le texte est trop long !"
                    bVerifierDispo = False
                End If
            Catch
            End Try

        Catch ex As Exception
            sMsgErr = "Erreur : " & ex.Message
            bVerifierDispo = True
            'sMsgErr = "Impossible d'obtenir la traduction, ressayer plus tard."
            'sMsgErr = "Cannot get the translation. Please try again later."

        End Try

    End Function

End Class

Conclusion :


En soit cette source n'a rien de particulièrement original, j'ai juste cherché à faire un outil pratique et simple à utiliser.
N'hésitez pas à proposer des améliorations.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.