Traduire automatiquement toute l'application en une autre langue

cs_aus3004 Messages postés 319 Date d'inscription jeudi 1 avril 2010 Statut Membre Dernière intervention 16 mars 2011 - 16 mai 2010 à 18:47
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 18 mai 2010 à 08:14
Bonsoir,

J'ai trouvé ce code très intéressant sur vbfrance mais il n'est pas terrible.

Je m'explique : ce code permet de traduire (avec Google) les controles et formulaires de l'appli.

J'ai besoin de traduire TOUTE l'appli, pas seulement les controles et formulaires.

- Il y aurait-il la possibilité de détécter tout le texte de l'appli pour ensuite le traduire ?

- Ou de traduire toute une page web affichée dans un webbrowser ?

Merci d'avance pour votre aide !
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

12 réponses

Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 mai 2010 à 10:01
Bonjour,

Je sais que ceci n'est pas vraiment une réponse à ton problème, mais évite les traducteurs automatiques. On récupère souvent du petit nègre incompréhensible.

J'en veux pour preuve le site MSDN de Microsoft (au moins il prévienne que c'est une traduction automatique) où pour comprendre il vaut mieux traduire en... anglais.

Dans ton cas, tous les logiciels traduits que j'ai vu l'ont été par des traducteurs bénévoles, mais il faut les trouver.


Calade
0
cs_aus3004 Messages postés 319 Date d'inscription jeudi 1 avril 2010 Statut Membre Dernière intervention 16 mars 2011 1
17 mai 2010 à 15:34
Oui en effet ça ne m'aide pas beaucoup.

En ce qui concerne la traduction automatique, je ne vois pas d'autres initiatives à prendre car je suis un débutant.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 mai 2010 à 16:43
Essaie de voir dans tes connaissances si certains pourraient t'aider à ce travail. Tu peux aussi lancer un appel sur le Net.

Ensuite, sans vouloir te juger, pour un débutant, viser une application internationale avec toutes les langues que tu listes dans ton post, peut-être est-ce viser un peu haut ?


Calade
0
cs_aus3004 Messages postés 319 Date d'inscription jeudi 1 avril 2010 Statut Membre Dernière intervention 16 mars 2011 1
17 mai 2010 à 16:52
C'est vrai que c'est viser haut mais ce code permet presque de traduire toute l'appli, je pensai que ce serait simple...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 mai 2010 à 17:12
Désolé, mais rien n'est vraiment simple en développement.

As-tu remarqué que très peu de logiciels (hormis Windows, Office et d'autres du même acabit), les freewares et autres sharewares ne proposent jamais une telle palette de langues ? Sorti des 4/5 langues européennes les plus courantes, cela devient rarissime.


Calade
0
cs_aus3004 Messages postés 319 Date d'inscription jeudi 1 avril 2010 Statut Membre Dernière intervention 16 mars 2011 1
17 mai 2010 à 18:36
Peut être parce que personne ne pensait pouvoir utiliser la traduction de Google avec ce code.
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
17 mai 2010 à 21:30
Bonjour,

Premièrement, lorsque l'on veut faire un programme multi-langue il vaut mieux le faire à la base. Je suis sur que le passage par un/des fichiers de conf XML ou ini sont un très bon moyen.

Maintenant, je n'ai pas l'impression que c'est ce que tu veux mais juste traduire. J'en comprends que tu souhaites avoir des .exe différents pour chaque langue.

Je peux te soumetre deux méthodes qui sont et c'est rien de le dire loin d'être simples. (à noter que je suis un dévelpopeur VB6 mais ya pas de raison pour que ca ne marche pas en .net ^^)

la première est que dans ton .exe les chaines de caractères apparaissent. Elles sont généralement des chaines terminées par des zéros et si ton code ne se sert pas de constantes pour désigner la taille on doit pouvoir disséquer le .exe, en sortir les chaines de caractère, les traduire puis reconstruire le .exe (attention aux checksums si il y en a)

la seconde, du même acabit mais en moins tordu tout de même ^^ c'est qu'au lieu de passer le .exe à la moulinette, je te propose de travailler avec tes fichiers sources. La il s'agit de fichiers de types textes. Un gros regexp + des requestes google traduction pourraient faire l'affaire.

ce sont des idées comme ca,
peut être te donneront-elles des pistes.

ps: ces solutions si elles sont implémentées feraient l'oeuvre d'un projet entier. si le but est de traduire en deux spi un programme, c'est évident que ce ne serra pas bon...

cordialement,
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
0
cs_aus3004 Messages postés 319 Date d'inscription jeudi 1 avril 2010 Statut Membre Dernière intervention 16 mars 2011 1
17 mai 2010 à 21:38
Merci pour ta participation à la résolution de mon problème.

En effet, je suis un débutant et je pige vraiment quedal à ta solution de pro.

En faite, tout à un début et mon Navigateur Internet est un projet qui sera commercialisé tôt au tard dans differents pays; il faut donc que je commence à songer à le traduire en plusieurs langues.

Je commence à penser qu'on peut vraiment rien tirer de ce code

Bonne continuation à nous tous
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
17 mai 2010 à 23:08
honnêtement,si il est question de "vendre" l'application, tu ne peux pas te permettre d'utiliser des traductions houleuses de google traduction...

deplus, juste entre nous, cela m'étonnerais qu'un webBrowser en VB soit plus performant que FireFox ou autres ...

enfin, a toi de nous prouver le contraire ^_^
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
0
cs_aus3004 Messages postés 319 Date d'inscription jeudi 1 avril 2010 Statut Membre Dernière intervention 16 mars 2011 1
18 mai 2010 à 00:08
Je sais que Google interdit que l'on accède à ses servives autrement que par le site officiel mais il y a qu'une phrase à propos de cela dans les 10 000 lignes de chartre ;)

En faite, je veux pas (ou plutôt peux pas) concurencer de telles firmes car je suis qu'un jeuno de 15 ans mais je peux m'attaque à d'autres navigateurs que IE, Chrome, Safari, Opera et Firefox en developpant ce navigateur à partir de fonctionnalités uniques.

Par exemple, Firefox ne mettra jamais en place un system pour cracker les clés wifi des boxs alors que moi, derriere une option permettant devaluer la sécurité de la box, je peux tranquillement placer dans le navigateur ce petit atout que tout le monde convoite (à condition de savoir comment faire bien sûr !)

Si vous êtes interessez vous pouvez télécharger le setup sur le site officiel ovix.fr qui ouvrira la semaine prochaine (je développe Ovix depuis moins d'un mois, pas de foutage de gueule si vous vous attendiez à un navigateur miracle).

Tout à un début, ce qui compte c'est de commencer !

À bientôt
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
18 mai 2010 à 07:35
pour ma part il n'est pas question de se moquer, il faut bien commencer à un momment ou un autre ^_^

je te souhaite bon courrage et si tu as des questions en VB, VBfrance est la pour ça.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
18 mai 2010 à 08:14
Bonjour,

Plus sérieusement (et surtout plus constructif) que ce que je t'ai déjà dit. Il peut y avoir un (début de) solution en utilisant les ressources chaînes (dans un fichier de ressources), mais vu le nombre de libellés et de langues il faudra être extrêmement rigoureux, en mettant par exemple un préfixe (numérique) pour chaque langue.

Mais cela imposera que chaque caption d'un label devra utiliser la bonne chaîne avec le bon préfixe, etc... très, très contraignant.


Calade
0
Rejoignez-nous