Problème avec la traduction google traduction api et c# - C#/.NET managed - Programmation
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)
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.
Marsh Posté le 06-06-2016 à 11:00:17
rahmoune a écrit : Bonjour Moumoule, |
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 :
|
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 ? )
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
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 :
|
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 =)
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; }
}
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 !
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;
}
}