Microsoft propose un service de traduction en ligne :
https://datamarket.azure.com/dataset/bing/microsofttranslator
Il est possible d'utiliser ce service via un site Web ou un programme. Le site MSDN donne toutes les informations nécessaires et le Market Azure assure l'abonnement au service. Mais si MSDN propose des exemples de codes en C# et PHP, je ne trouvais rien en VB ou du moins le peu de disponible sur le Web propose des méthodes obsolètes (anciennement supportées par Microsoft).
Donc voila ma contribution, sous forme d'une Classe créée avec Visual Studio Express 2012 (gratuit), qui est une reprise (à ma sauce...) de l'exemple MSDN suivant :
http://msdn.microsoft.com/en-us/library/hh454950.aspx.
Tous les détails du service de traduction sont visibles depuis le lien suivant :
http://www.microsofttranslator.com/dev/
J'ai essayé de mettre des commentaires explicatif dans le code, mais globalement, la méthode consiste à récupérer un accès (Token) en mode Web (http), auprès du service, avec des identifiants (obligatoires) que vous créez en créant un compte sur le Market Azure. Ces identifiants sont alors utilisés pour exécuter (en mode Web) des requêtes auprès de Bing Translator.
Il y a 2 identifiants : _clientID et _clientSecret
A compléter directement dans le code ou a passer en argument à la Classe.
Je me suis contenté de tester deux fonctions du service (
http://msdn.microsoft.com/en-us/library/dd576287.aspx) :
- détection de la langue sur un texte
- traduction d'un texte en désignant la langue source (par défaut fr) et la langue destination (par défaut en)
Source / Exemple :
'
' Bing Translator Management Class
'
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Runtime.Serialization
''' -----------------------------------------------------------------------------------------
''' <summary>
''' Structure de données pour la demande d'un Token d'accès au service Microsoft Bing
''' </summary>
''' <remarks>
''' VOIR DataContractAttribute dans MSDN :
''' Spécifie que le type définit ou implémente un contrat de données et qu'il est sérialisable
''' par un sérialiseur, tel que le DataContractSerializer.Pour rendre un type sérialisable,
''' les auteurs de types doivent définir un contrat de données pour ce type.
''' </remarks>
''' -------------------------------------------------------------------------------------------
<DataContract()> Public Class AdmAccessToken
' ------------------------------------------------------------------------------------------ACCESS
Private m_access_token As String
<DataMember()> Public Property access_token() As String
Get
Return m_access_token
End Get
Set(ByVal value As String)
m_access_token = value
End Set
End Property
' ------------------------------------------------------------------------------------------TYPE
Private m_token_type As String
<DataMember()> Public Property token_type() As String
Get
Return m_token_type
End Get
Set(ByVal value As String)
m_token_type = value
End Set
End Property
' ------------------------------------------------------------------------------------------EXPIRE
Private m_expires_in As String
<DataMember()> Public Property expires_in() As String
Get
Return m_expires_in
End Get
Set(ByVal value As String)
m_expires_in = value
End Set
End Property
' ------------------------------------------------------------------------------------------SCOPE
Private m_scope As String
<DataMember()> Public Property scope() As String
Get
Return m_scope
End Get
Set(ByVal value As String)
m_scope = value
End Set
End Property
End Class
' ==============================================================================================
''' -----------------------------------------------------------------------------------------
''' <summary>
''' Getsion de gestion de l'authentification sur le service Microsoft Bing de traduction.
''' Se charge de réaliser la demande et de renvoyer le Token dans sa structure.
''' </summary>
''' <remarks>
''' Voir code exemple C# : http://msdn.microsoft.com/en-us/library/hh454950.aspx
''' </remarks>
''' -----------------------------------------------------------------------------------------
Public Class AdmAuthentication
Public Const DataMarketAccessUri As String = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"
Private clientId As String
Private cientSecret As String
Private request As String
''' ---------------------------------------------------------------------------------------
''' <summary>
''' Création de l'objet avec deux variables d'identification du service MS Bing
''' </summary>
''' <param name="clientId">ID : registered application with Azure DataMarket</param>
''' <param name="clientSecret">Secret :registered application with Azure DataMarket</param>
''' ---------------------------------------------------------------------------------------
Public Sub New(ByVal clientId As String, ByVal clientSecret As String)
Try
clientId = clientId : cientSecret = clientSecret
' If clientid or client secret has special characters, encode before sending request
request = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret))
Catch Err As Exception
Call MsgBox("Newing MS Bing Authentication operation failed." & vbCrLf & Err.Message)
End Try
End Sub
''' ---------------------------------------------------------------------------------------
''' <summary>
''' Appel principal à la récupération d'un Token d'accès
''' </summary>
''' <remarks>
''' The access token is valid for 10 minutes.
''' If the access token expires, you need to generate a new access token.
''' </remarks>
''' <returns>La structure AdmAccessToken avec les informations nécessaires</returns>
''' ---------------------------------------------------------------------------------------
Public Function GetAccessToken() As AdmAccessToken
GetAccessToken = Nothing
Try
Return HttpPost(DataMarketAccessUri, request)
Catch Err As Exception
Call MsgBox("Getting MS Bing Token operation failed." & vbCrLf & Err.Message)
End Try
End Function
''' --------------------------------------------------------------------------------------
''' <summary>
''' Appel privé de création du Token d'accès.
''' </summary>
''' <param name="DatamarketAccessUri">URL Azure DataMarket</param>
''' <param name="requestDetails">La ligne formatée des paramètres de demande de Token</param>
''' <returns>La structure AdmAccessToken avec les informations nécessaires</returns>
''' --------------------------------------------------------------------------------------
Private Function HttpPost(ByVal DatamarketAccessUri As String, ByVal requestDetails As String) As AdmAccessToken
HttpPost = Nothing
Try
' Prepare de la réquête d'authentifiction
Dim theWebRequest As HttpWebRequest = CType(WebRequest.Create(DatamarketAccessUri), HttpWebRequest)
theWebRequest.ContentType = "application/x-www-form-urlencoded"
theWebRequest.Method = "POST"
Dim theBytes As Byte() = Encoding.ASCII.GetBytes(requestDetails)
theWebRequest.ContentLength = theBytes.Length
' Requête
Using outputStream As System.IO.Stream = theWebRequest.GetRequestStream()
Call outputStream.Write(theBytes, 0, theBytes.Length)
End Using
' Attente de la réponse suite à la requête
Using theWebResponse As System.Net.WebResponse = theWebRequest.GetResponse()
Dim serializer As New DataContractJsonSerializer(GetType(AdmAccessToken))
' Get deserialized object from JSON stream
If serializer IsNot Nothing Then HttpPost = DirectCast(serializer.ReadObject(theWebResponse.GetResponseStream()), AdmAccessToken)
serializer = Nothing
End Using
Catch Err As WebException
' Obtain detailed error information
Dim strResponse As String = vbNullString
Using response As HttpWebResponse = CType(Err.Response, HttpWebResponse)
Using responseStream As Stream = response.GetResponseStream()
Using sr As New StreamReader(responseStream, System.Text.Encoding.ASCII)
strResponse = sr.ReadToEnd()
End Using
End Using
End Using
Call MsgBox("Preparing MS Bing Post operation failed: " & strResponse & vbCrLf & Err.Message)
Catch Err As Exception
Call MsgBox("Preparing MS Bing Post operation failed." & vbCrLf & Err.Message)
End Try
End Function
End Class
' ==============================================================================================
''' --------------------------------------------------------------------------------------------
''' <summary>
''' Objet de définition de ressources pour réaliser des traductions en ligne via le service
''' Web de Microsoft Bing.
''' </summary>
''' <remarks>
''' L'utilisation de la traduction Microsoft nécessite de s'enregistrer sur le Market Azure
''' de Microsoft. Il y a donc des prérequis pour une utilisation dans une programme.
''' Voir dans MSDN "Getting Starded With Microsoft Translator" pour plus de détails :
''' http://msdn.microsoft.com/en-us/library/hh454949.aspx
'''
''' Mais surtout le site suivant : http://www.microsofttranslator.com/dev/
'''
''' Voir MSDN pour Microsoft Translator :
''' http://msdn.microsoft.com/en-us/library/dd576287.aspx
''' The Microsoft Translator service can be used in web or client applications to perform
''' language translation, and other language-translated operations.
''' </remarks>
''' --------------------------------------------------------------------------------------------
Public Class TranslatorBing
''' <summary>Le lien principal d'accès au service MS Bing</summary>
Private Const BingServiceURL As String = "http://api.microsofttranslator.com/v2/Http.svc/"
Private Const BingHeader As String = "Bearer "
''' <summary>
''' Bing AppId : ID - Les clefs d'identification du service Bing !
''' </summary>
Private _clientID As String = "ajouter ici votre client ID ou passez les en argument de crétaion de la Classe !"
Public Property clientID() As String
Get
Return _clientID
End Get
Set(ByVal value As String)
_clientID = value
End Set
End Property
''' <summary>
''' Bing AppId : Secret - Les clefs d'identification du service !
''' </summary>
Private _clientSecret As String = "ajouter ici votre client Secret ou passez les en argument de création de la Classe !"
Public Property clientSecret() As String
Get
Return _clientSecret
End Get
Set(ByVal value As String)
_clientSecret = value
End Set
End Property
''' <summary>Authentification d'accès au service MS Bing</summary>
Private admAuth As AdmAuthentication = Nothing
''' <summary>Le Token d'accès au service MS Bing</summary>
Private admToken As AdmAccessToken = Nothing
''' ---------------------------------------------------------------------------------
''' <summary>
''' Création de l'objet pour réaliser une traduction de texte.
''' </summary>
''' ---------------------------------------------------------------------------------
Public Sub New(Optional ByVal IDclient As String = vbNullString, Optional ByVal SECRETclient As String = vbNullString)
Try
' Valeurs d'identification de connexion
If Len(IDclient) > 0 Then clientID = IDclient
If Len(SECRETclient) > 0 Then clientSecret = SECRETclient
' Allocation de l'accès au service
admAuth = New AdmAuthentication(clientID, clientSecret)
If admAuth Is Nothing Then Call MsgBox("Unable to allocation new MS Bing Authentication.")
Catch Err As Exception
Call MsgBox("New MS Bing Translator object." & vbCrLf & Err.Message)
End Try
End Sub
''' --------------------------------------------------------------------------------------
''' <summary>
''' Vérifie que l'accès est possible et récupère le Token
''' </summary>
''' <returns>True pour réussite</returns>
''' --------------------------------------------------------------------------------------
Private Function CheckTokenAccess() As Boolean
CheckTokenAccess = False
Try
' Vérification et Initialisation de l'accès
If admAuth Is Nothing Then
Call MsgBox("Authenticating is wrong, unable to use translation service." & vbCrLf & IIf(Len(clientID) > 0 And Len(clientSecret) > 0, " ", "No ").ToString & "Access ID")
Exit Function
End If
admToken = admAuth.GetAccessToken()
If admToken Is Nothing Then
Call MsgBox("Getting access token operation failed." & vbCrLf & IIf(Len(clientID) > 0 And Len(clientSecret) > 0, " ", "No ").ToString & "Authentication")
Exit Function
End If
CheckTokenAccess = True
Catch Err As Exception
Call MsgBox("MS Bing detecting language operation failed." & vbCrLf & Err.Message)
End Try
End Function
''' --------------------------------------------------------------------------------------
''' <summary>
''' A partir du texte passé en argument, la fonction réalise une détection de la langue
''' correspondante.
''' </summary>
''' <param name="theText"></param>
''' <returns>Une chaine (courte) de caractères lié à la langue détectée</returns>
''' --------------------------------------------------------------------------------------
Public Function DetectLanguage(ByVal theText As String) As String
DetectLanguage = vbNullString
Dim theWebResponse As System.Net.WebResponse = Nothing
Try
' Vérification et Initialisation accès par le Token
If CheckTokenAccess() = False Then Exit Function
' Authorization header to the calls to the Microsoft Translator API.
Dim headerValue As String = BingHeader & admToken.access_token
' Construction de l'URL de la demande et de la requête Web d'appel au service : DETECT
Dim theWebRequest As System.Net.WebRequest = System.Net.WebRequest.Create(BingServiceURL & "Detect?text=" & HttpUtility.UrlEncode(theText))
' Ajout de l'entête qui contient l'autorisation d'accès
Call theWebRequest.Headers.Add("Authorization", headerValue)
' Demande d'une réponse par l'exécution de la requête par l'URL
theWebResponse = theWebRequest.GetResponse()
' Traitement du retour de la requête
Using outputStream As System.IO.Stream = theWebResponse.GetResponseStream()
' Récupération de la valeur dans le bon format
Dim theSerializer As New System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"))
If theSerializer IsNot Nothing Then DetectLanguage = theSerializer.ReadObject(outputStream).ToString
End Using
Catch Err As Exception
Call MsgBox("MS Bing detecting language operation failed." & vbCrLf & Err.Message)
Finally
If theWebResponse IsNot Nothing Then
Call theWebResponse.Close()
theWebResponse = Nothing
End If
End Try
End Function
''' ----------------------------------------------------------------------------------------
''' <summary>
''' Réalise la traduction du texte en argument via le service MS Bing.
''' </summary>
''' <param name="theText">La chaine de caractères à traduire</param>
''' <param name="fromLang">La langue source, par défaut fr (France)</param>
''' <param name="toLang">La langue de destination, par défaut en (English)</param>
''' <returns>String : le résultat de la traduction</returns>
''' ----------------------------------------------------------------------------------------
Public Function TranslateText(ByVal theText As String,
Optional ByVal fromLang As String = "fr",
Optional ByVal toLang As String = "en") As String
TranslateText = theText
Dim theWebResponse As System.Net.WebResponse = Nothing
Try
' Vérification et Initialisation accès par le Token
If CheckTokenAccess() = False Then Exit Function
' Authorization header to the calls to the Microsoft Translator API.
Dim headerValue As String = BingHeader & admToken.access_token
' Construction de l'URL de la demande et de la requête Web d'appel au service : TRANSLATE
Dim theWebRequest As System.Net.WebRequest = System.Net.WebRequest.Create(BingServiceURL & "Translate?text=" & HttpUtility.UrlEncode(theText) & "&from=" & fromLang & "&to=" & toLang)
' Ajout de l'entête qui contient l'autorisation d'accès
Call theWebRequest.Headers.Add("Authorization", headerValue)
' Récupération de la réponse du service Web
theWebResponse = theWebRequest.GetResponse()
' Traitement du retour de la requête
Dim outputStream As System.IO.Stream = theWebResponse.GetResponseStream()
'Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("utf-8")
' Récupération de la valeur dans le bon format
Dim translatedStream As New System.IO.StreamReader(outputStream, System.Text.Encoding.GetEncoding("utf-8"))
' Crétaion d'un objet de lecture du résultat XML
Dim xTranslation As New System.Xml.XmlDocument()
' Chargement du résultat dans l'objet XML
Call xTranslation.LoadXml(translatedStream.ReadToEnd())
' Récupération de la traduction
TranslateText = xTranslation.InnerText
xTranslation = Nothing
translatedStream = Nothing
Catch Err As Exception
Call MsgBox("MS Bing translating operation failed." & vbCrLf & Err.Message)
Finally
If theWebResponse IsNot Nothing Then
Call theWebResponse.Close()
theWebResponse = Nothing
End If
End Try
End Function
End Class
Conclusion :
Le service de Microsoft est gratuit jusqu'à 2 000 000 de caractères par mois, ensuite il y a une tarification adaptée au nombre de caractères supplémentaires.
Je n'ai pas encore tester la limite pour me rendre compte de l'intérêt du nombre de caractères. Mais ce service peut en compléter d'autres comme WordReference.com (
http://www.vbfrance.com/codes/EXEMPLE-NET-UTILISATION-SERVICE-TRADUCTION-TERMES-VIA-SERVICE_54727.aspx) et peut permettre une aide à la traduction d'interfaces graphiques.
Il y a aussi un Blog MSDN sur le sujet (
http://blogs.msdn.com/b/translation/), mais j'avoue ne pas y avoir porté attention pour le moment.
Je n'ai rien trouvé sur Google Translate, mais je crois qu'il est nécessaire de procéder à un abonnement pour une utilisation automatique et intégrée dans un programme. Si l'un d'entre vous à un exemple fonctionnel en VB pour Google, je suis preneur :-)
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.