Traduire automatiquement toute l'application en une autre langue
cs_aus3004
Messages postés319Date d'inscriptionjeudi 1 avril 2010StatutMembreDernière intervention16 mars 2011
-
16 mai 2010 à 18:47
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDerniè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
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 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
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 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
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 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.
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 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
cs_aus3004
Messages postés319Date d'inscriptionjeudi 1 avril 2010StatutMembreDernière intervention16 mars 20111 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
cs_aus3004
Messages postés319Date d'inscriptionjeudi 1 avril 2010StatutMembreDernière intervention16 mars 20111 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 !
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 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.