Erreur dans traduction via api google :"Index and length must refer to a locatio [Résolu]

tkd1984 15 Messages postés lundi 15 janvier 2007Date d'inscription 10 mars 2009 Dernière intervention - 9 mars 2009 à 16:12 - Dernière réponse : krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention
- 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
Afficher la suite 

3 réponses

Répondre au sujet
tkd1984 15 Messages postés lundi 15 janvier 2007Date d'inscription 10 mars 2009 Dernière intervention - 10 mars 2009 à 14:59
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de tkd1984
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 10 mars 2009 à 10:53
0
Utile
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()) ;
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 10 mars 2009 à 16:38
0
Utile
"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()) ;
Commenter la réponse de krimog

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.