Problème avec la traduction google traduction api et c#

Problème avec la traduction google traduction api et c# - C#/.NET managed - Programmation

Marsh Posté le 03-06-2016 à 14:26:20    

Bonjour,
Je suis nouveau dans le domaine, je suis entrain de coder un programme de traduction en c# et google traduction api v2,j'ai réspetcer toutes les formalités pour le compte google, le problème est quand je compile, au lieu d'avoir la traduction je reçoit seulement le mot (data), est ce qu'il y a quelqu'un qui a une idée, voilà mon code et merci d'avance.
 
public string Translate(string sourceText,string sourceLanguage,string targetLanguage)
        {
            // Initialize
            this.Error = null;
            string translation = string.Empty;
             
            //string apKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
 
            try
            {
               /*string url = string.Format("https://www.googleapis.com/language/translate/v2?key=" + apKey+
                                "&q=" + sourceText+
                               "&source=" + sourceLanguage+
                               "&target=" + targetLanguage);
 
                string outputFile = Path.GetTempFileName();
                using (WebClient wc = new WebClient())
                {
                    wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0         Safari/537.36" );
                    wc.DownloadFile(url, outputFile);
}
}
 private void btnTranslate_Click(object sender, EventArgs e)
        {
            traductionRichTextBox.Text = string.Empty;
            traductionRichTextBox.Update();
            traduction = null;
 
            // Translate the text
            try
            {
                this.Cursor = Cursors.WaitCursor;
 
                traductionRichTextBox.Text = Translate(sourceRichTextBox.Text.Trim(), (string)fromComboBox.SelectedItem, (string)toComboBox.SelectedItem);
                if (Error == null)
                {
                    this.traductionRichTextBox.Update();
                }
                else
                {
                    MessageBox.Show(g.Error.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

Reply

Marsh Posté le 03-06-2016 à 14:26:20   

Reply

Marsh Posté le 03-06-2016 à 15:28:15    

A mon avis, le problème vient du fait que tu recois un objet JSON en retour:
 
{
 "data": {
  "translations": [
   {
    "translatedText": "Hallo Welt"
   }
  ]
 }
}
 
Tu dois atteindre translatedText : data.translations, après pour translatedText tu dois faire gaffe car c'est un array ! De ce fait, data.translations.translatedText ne marchera pas. Pour le premier élément: data.translations[0].translatedText
 
Note: le résult de la fonction Translate est un string. De ce fait, tu dois impérativement parser ce JSON pour pouvoir accéder aux propriétés de l'objet:
 
// namespace:  System.Web.Script.Serialization
JavaScriptSerializer parser = new JavaScriptSerializer();
parser.Deserialize<Classe_custom>(response_de_la_fonction_translate);
 
Classe_custom  est une classe qui reprend la structure de la réponse (https://cloud.google.com/translate/v2/quickstart#before-you-begin)


Message édité par Moumoule le 03-06-2016 à 15:28:28
Reply

Marsh Posté le 03-06-2016 à 18:40:31    

Bonjour Moumoule,
J'utilise même pas Json, mon problème je pense que c'est côté de appkey, même si j'ai vérifié dans google translate, je vois que tut est correct, l'app est activé. Je dis ça pqr ce que j'ai un autre url qui fonctionne, mais c'est pas un api v2, il est comme  gratuit le voila:
string url = string.Format("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}",
                                            sourceLanguage,
                                            targetLanguage,
                                            sourceText);
Mais moi je veux que le programme foctionne avec appkey.
 
Merci d'avance pour ta réponse.

Reply

Marsh Posté le 06-06-2016 à 11:00:17    

rahmoune a écrit :

Bonjour Moumoule,
J'utilise même pas Json, mon problème je pense que c'est côté de appkey, même si j'ai vérifié dans google translate, je vois que tut est correct, l'app est activé. Je dis ça pqr ce que j'ai un autre url qui fonctionne, mais c'est pas un api v2, il est comme  gratuit le voila:
string url = string.Format("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}",
                                            sourceLanguage,
                                            targetLanguage,
                                            sourceText);
Mais moi je veux que le programme foctionne avec appkey.
 
Merci d'avance pour ta réponse.


 
A mon avis tu as pas compris ce que je voulais dire.
 
Le résultat de l'appel de l'API est un JSON. De ce fait, de ton côté, tu vas devoir traiter ce JSON:
 

Code :
  1. Translating text
  2. This section demonstrates a few ways to request translations. To run each example, copy the URL and paste it into your browser. Don't forget to replace YOUR_API_KEY with your actual API key.
  3. The URL for a request has the following format:
  4. https://www.googleapis.com/language [...] parameters
  5. Three query parameters are required with each translation request:
  6.     API key: Use the key parameter to identify your application.
  7.     Target language: Use the target parameter to specify the language you want to translate into.
  8.     Source text string: Use the q parameter to specify the text to translate.
  9. All other query parameters are optional. The URL for GET requests, including parameters, must be less than 2K characters.
  10. Translating a single string
  11. To translate a string, just make a request using the required parameters. Here is an example that specifies the source language, using the optional source query parameter:
  12. https://www.googleapis.com/language [...] lo%20world
  13. If the request is successful, the server returns a 200 OK HTTP status code and the response in JSON format:
  14. 200 OK
  15. {
  16.     "data": {
  17.         "translations": [
  18.             {
  19.                 "translatedText": "Hallo Welt"
  20.             }
  21.         ]
  22.     }
  23. }
  24. In this example, the response is an array containing a single translatedText field with the translation.


 
Après, si tu as des problème authentification (appkey), ça c'est autre chose. Après, quand je regarde ta fonction Translate, je vois pas de retour (manque pas un return de la variable translation ? Tu garnis quand la variable translation ? )

Reply

Marsh Posté le 06-06-2016 à 20:58:38    

Bonjour,
 
Pour la variable translation, je l'ai mauqué en séelectionnant la méthode. Mais ce que je veux savoir, ou je placerai les lignes pour parcer Json, par ce que je n'ai pas d'autres classes, j'ai la méthode de traduction et le boutton, peut tu m'expliquer plus et si ce n'est pas trop, tu peut ajouter un exemple dans mon code.
 
Merci d'avance

Reply

Marsh Posté le 07-06-2016 à 11:30:26    

Bon, normalement je fais pas de code à la demande comme ca car y a les ressources disponibles sur le net ... en masse même. Soit:
 

Code :
  1. public string Translate(string sourceText,string sourceLanguage,string targetLanguage)
  2.         {
  3.             // Initialize  
  4.             this.Error = null;
  5.             string translation = string.Empty;
  6.            
  7.             //string apKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  
  8.             try
  9.             {
  10.                string url = string.Format("https://www.googleapis.com/language/translate/v2?key=" + apKey+
  11.                                 "&q=" + sourceText+
  12.                                "&source=" + sourceLanguage+
  13.                                "&target=" + targetLanguage);
  14.                 string outputFile = Path.GetTempFileName();
  15.                 using (WebClient wc = new WebClient())
  16.                 {
  17.                     wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0         Safari/537.36" );
  18.                 wc.DownloadFile(url, outputFile);
  19.                  translation = wc.DownloadString(url);
  20.                  return translation
  21. } catch (Exception ex) {
  22.             throw new Exception(ex.toString());
  23. }
  24. }
  25. private void btnTranslate_Click(object sender, EventArgs e)
  26.         {
  27.             traductionRichTextBox.Text = string.Empty;
  28.             traductionRichTextBox.Update();
  29.             traduction = null;
  30.             // Translate the text  
  31.             try
  32.             {
  33.                 this.Cursor = Cursors.WaitCursor;
  34.                 string retourTranslate = Translate(sourceRichTextBox.Text.Trim(), (string)fromComboBox.SelectedItem, (string)toComboBox.SelectedItem);
  35.                
  36.                 traductionRichTextBox.Text = retourTranslate;
  37.                 if (Error == null)
  38.                 {
  39.                     this.traductionRichTextBox.Update();
  40.                 }
  41.                 else
  42.                 {
  43.                     MessageBox.Show(g.Error.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  44.                 }
  45.             }
  46.             catch (Exception ex)
  47.             {
  48.                 MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  49.             }
  50.             finally
  51.             {
  52.                 this.Cursor = Cursors.Default;
  53.             }
  54.         }
  55. class responseAPI {
  56.         // Si c'est du JSON, tu vas devoir décrire le résultat (voir parser.Deserialize)
  57. }


 
Ce qui est important c'est de voir à quoi ressemble la variable "retourTranslate". Si c'est du JSON, tu dois parser ce JSON (après  string retourTranslate = Translate(sourceRichTextBox.Text.Trim(), (string)fromComboBox.SelectedItem, (string)toComboBox.SelectedItem); )
 
Par contre pour parser un JSON en c#, tu as un petit snippet dans un de mes précédants posts. Sinon => google est ton ami =)


Message édité par Moumoule le 07-06-2016 à 11:32:28
Reply

Marsh Posté le 09-06-2016 à 13:39:58    

Bonjour Moumoune,
 
Merci beaucoup mon problème est resolu, c'était la deserialisation de Json qui causait un problème, alors j'ai ajouté 3 classesavec le datcontract, et j'ai fait l'appel dans la déserialisation et ça marchait. Voilà mon code fonctionnel:
 
public string Translate(string sourceText,string sourceLanguage,string targetLanguage)
        {
            // Initialize  
            this.Error = null;
            string translation = string.Empty;
           
            //string apKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  
            try
            {
               string url = string.Format("https://www.googleapis.com/language/translate/v2?key=" + apKey+
                                "&q=" + sourceText+
                               "&source=" + sourceLanguage+
                               "&target=" + targetLanguage);
                string outputFile = Path.GetTempFileName();
                using (WebClient wc = new WebClient())
                {
                    wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0         Safari/537.36" );
                 translation = wc.DownloadString(url);
                 
                  resultat = HttpUtility.HtmlDecode(resultat);
 
                  JavaScriptSerializer oSerializer = new JavaScriptSerializer();
                 GgleTranslation oTraduction = oSerializer.Deserialize<GgleTranslation>(resultat);
 
                traduction = oTraduction.Data.Translations[0].TranslatedText;
                 return translation
} catch (Exception ex) {
            throw new Exception(ex.toString());
}
}
private void btnTranslate_Click(object sender, EventArgs e)
        {
            traductionRichTextBox.Text = string.Empty;
            traductionRichTextBox.Update();
            traduction = null;
            // Translate the text  
            try
            {
                this.Cursor = Cursors.WaitCursor;
                string retourTranslate = Translate(sourceRichTextBox.Text.Trim(), (string)fromComboBox.SelectedItem,             (string)toComboBox.SelectedItem);
               
                traductionRichTextBox.Text = retourTranslate;
                if (Error == null)
                {
                    this.traductionRichTextBox.Update();
                }
                else
                {
                    MessageBox.Show(g.Error.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }
 [DataContract]
    public class GgleTranslation
    {
        [DataMember(Name = "data" )]
        public Data Data { get; set; }
    }
 
    [DataContract]
    public class Data
    {
        [DataMember(Name = "translations" )]
        public List<Translation> Translations { get; set; }
    }
 
    [DataContract]
    public class Translation
    {
        [DataMember(Name = "translatedText" )]
        public string TranslatedText { get; set; }
    }

Reply

Marsh Posté le 09-06-2016 à 16:47:53    

rahmoune a écrit :

c'était la deserialisation de Json qui causait un problème, alors j'ai ajouté 3 classesavec le datcontract, et j'ai fait l'appel dans la déserialisation et ça marchait.


 
C'est le terme que je cherchais, déserialisation.
 

Citation :

traduction = oTraduction.Data.Translations[0].TranslatedText;


 
Fait juste attention (je pense que tu le sais déjà), cela va te renvoyer la première traduction de la liste Translation.
 
Content d'avoir pu aider !


Message édité par Moumoule le 09-06-2016 à 16:48:52
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed