Classe d'utilisation du service de traduction microsoft bing


Contenu du snippet

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 :-)

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.