Erreur dans traduction via api google :"Index and length must refer to a locatio

Résolu
tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009 - 9 mars 2009 à 16:12
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 10 mars 2009 à 16:38
bonjour
j'ai entrain de realiser une application desktop sous c#,qui traduire n'import quelle texte entrer avec l'aide de l'api google,voici le code :

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

using System.Net;



namespace



traducteur
{


class



googleTranslator
{


         // <summary>






         ///
Translate Text using Google Translate API's






         ///
Google URL - http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}






         ///


</summary>






         ///



Input string








         ///



2 letter Language Pair, delimited by "|".






         ///
E.g. "ar|en" language pair means to translate from Arabic to English








         ///


<returns>
Translated to String
</returns>






         public



static



string
TranslateText(

string
input,

string
languagePair){


                  string
url =

String
.Format(

"http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}"
, input, languagePair);


WebClient
webClient =

new



WebClient
();webClient.Encoding = System.Text.


Encoding
.UTF8;


string
result = webClient.DownloadString(url);


MessageBox
.Show(result.Length.ToString()+

" | "
+result.IndexOf(

"id=result_box"
).ToString()); result = result.Substring(result.IndexOf(


"id=result_box"
) + 20, result.IndexOf(

"id=result_box"
) + 500);

result = result.Substring(0, result.IndexOf(


"
));


return
result;}



mais lorsque j'aexecute le programme ,avec le texte entrer par exemple "salut" our le traduire en anglais,j'ai obtenus une exeption au niveau de ligne :
" result = result.Substring(result.IndexOf("id=result_box") + 20, result.IndexOf(
"id=result_box") + 500); "
cette eception est :
         ArgumentOutOfRangeException was unhandled
         Index and length must refer to a location within the string.
         Parameter name: length
s'il y a une erreur dans le code ,ou une chose qui manque n'hésiter pas ,
merci d'avance
A voir également:

3 réponses

tkd1984 Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 10 mars 2009
10 mars 2009 à 14:59
bonjour
merci pour votre réponse.
C'est une méthode un-officiel pour utiliser l'api google de traduction,pour vos remarques :
1- le nombre 500 c'est le nombre maximale a traduire que donne google(selon quelque tuto!!).
2- pour la limite ,c'est pas grave pars qu'il y le code html ,si tu coupe toute ,tu auras votre mots traduisés en plus le reste de code html.
donc j'ai modifier mon code,et j'ai réussis a traduire sans faute.voici le code :

public static string TranslateText(string input,string languagePair)
        {           
            string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair);
            WebClient webClient = new WebClient();

            webClient.Encoding = System.Text.Encoding.UTF8;

            string result = webClient.DownloadString(url);
            result = result.Substring(result.IndexOf("id=result_box") + 24);
            result = result.Substring(0, result.IndexOf("
"));
            result = MakeHTMLValid(result);
            return result;
        }
       
        public static string MakeHTMLValid(string aString)
        {

            string result = aString;
            // Replace Entities
            result = result.Replace("Ö", "&Ouml;");
            result = result.Replace("ö", "&ouml;");
            result = result.Replace("Ä", "&Auml;");
            result = result.Replace("ä", "&auml;");
            result = result.Replace("Ü", "&Uuml;");
            result = result.Replace("ü", "&uuml;");
            result = result.Replace("ß", "&szlig;");
            result = result.Replace("€", "&euro;");
            return result;
        }

pour la deusieme methode ,c'est facultatif.merci bien
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
10 mars 2009 à 10:53
Salut
avec ta ligne qui bug, tu lui demande de prendre une partie du string, à partir de 20 caractères au delà de "id=result_box" pour une longueur égale à la position de "id=result_box" + 500.
Je ne connais pas l'api google donc je ne sais pas à quoi ressemble "result", mais selon moi tu as 2 erreurs dans ton 2ème argument :
- Ton deuxième argument ne désigne pas l'indice de fin du substring, mais la longueur (donc utiliser IndexOf("id=result_box") me semble une erreur)
- Les limites que tu indique dans ton substring (1er et 2eme argument) ne doivent pas dépasser du string. Or "salut" ne se traduit pas en 500 caractères, donc tu me sembles aller trop loin dans la chaine => C'est ce qui génère l'exception

Comme je le disais, je ne connais pas l'API Google, mais je pense que ton code devrait plutôt ressembler à ça :

result = result.Substring(result.IndexOf("id=result_box") + 20);
Comme ça, ça ira de 20 caractères après id=result_box jusqu'à la fin

Krimog :
while (!succeed = try()) ;
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
10 mars 2009 à 16:38
"pour la limite ,c'est pas grave pars qu'il y le code html ,si tu coupe
toute ,tu auras votre mots traduisés en plus le reste de code html."

C'était justement ton problème. Tu essayais de lire plus de caractères qu'il n'y en avait dans la chaine. Donc immanquablement => OutOfRangeException.

Ce n'est pas parce que Google accepte 500 caractères que le retour fera exactement 500 caractères. Non seulement parce que le texte de base peut faire moins de 500 caractères (je crois que c'est le cas pour "salut" :p), mais aussi parce que quand tu traduits un texte, il ne fait pas la même taille que l'original.

Krimog :
while (!succeed = try()) ;
0
Rejoignez-nous