// Traductions en ligne// Eric Quillévéré 2009// v. 1.1 - 07/03/2009/*jsl:import js_rewrite.js *//*jsl:import caracteres.js */// Nom des objets pour lesquels la traduction est à exclurevar trad_exclure=Array();var trad_listeLangues=Array(	Array('Francais',	'France.gif'			,'fr'),	Array('English',	'United-Kingdom.gif'	,'en'));var trad_tailleGetLimite=1000; // Taille limite pour le GET traduction de Googlevar trad_tailleGetSansParam=150; // Taille d'un GET sans paramvar trad_objet=Array('traductions'); // Nom de l'objet dans lequel insérer les drapeauxvar trad_langueTxt='fr'; // Langue du texte par défautvar trad_langueActu=trad_langueTxt;var trad_fnctApresTrad=null;var trad_nomAttribut='txtOriginal';// Nom de l'attributvar trad_listeObj=Array(); // Liste des objets à traduire	// Objets en coursvar trad_EnCours_obj=Array(); var trad_EnCours_taille=0;// Séparateurs de traductions (pour regroupement)var trad_sep_deb='<p>';var trad_sep_fin='</p>';var trad_nbDemandes=0; // Nbre de traductions restantes// Ajoute les drapeaux// ptrad_exclure : objets à exclure de la traduction// trad_langueTxt : langue d'origine du textefunction traduction_init(ptrad_langueTxt, ptrad_listeLangues, ptrad_exclure)	{	trad_exclure=ptrad_exclure;	trad_langueTxt=ptrad_langueTxt;	trad_listeLangues=ptrad_listeLangues;	// Recherche l'objet traductions pour insérer les drapeaux	var objTrad=obj(trad_objet[0]);	if (!objTrad) return;		trad_EnCours_obj=Array();	trad_EnCours_taille=0;		for (var i=0;i<trad_listeLangues.length;i++)		{		var img=obj_Cree('img',objTrad);		img.title=trad_listeLangues[i][0];		img.src=trad_listeLangues[i][1];		img.lngDmdee=trad_listeLangues[i][2];		img.style.cursor='pointer';				img.onclick=function()			{			if (trad_langueActu!=this.lngDmdee)				{				obj_Opacite_Fixe(obj(trad_objet[0]) ,40);				traduction_demarre(document.body, trad_langueTxt, this.lngDmdee);				}			};		}				traduction_lectureCookie();	}	// Si langue demandée dans le cookie, traduction automatiquefunction traduction_lectureCookie()	{	var lngCookie=cookie_Lire('traductions');	if (lngCookie!==null && lngCookie!=trad_langueTxt)		{		obj_Opacite_Fixe(obj(trad_objet[0]) ,40);		traduction_demarre(document.body, trad_langueTxt, lngCookie);		}	}
// Démarre la traduction (depuis clic sur drapeau ou lecture Cookie)function traduction_demarre(objParent,lngSource, lngDesti, OPT_fonctionRetour)	{	if (!nonDef(OPT_fonctionRetour)) trad_fnctApresTrad=OPT_fonctionRetour;		// Ecrit un cookie permettant de mémoriser la langue choisie	cookie_Ecrire('traductions', lngDesti);	trad_langueActu=lngDesti;	traduction_parcoursObj(objParent, lngSource, lngDesti, 0);		traduction_appelGere(lngSource, lngDesti, null, true); // Vérifie si rien à traduire en stock	// Effectue les appels	// setTimeout pour éviter de bloquer Javascript trop longtemps	for (var i=0;i<trad_listeObj.length;i++)		{		trad_nbDemandes++;		setTimeout('traduction_appel (' + i +', \''+lngSource+'\', \''+lngDesti+'\')',5);					}				traduction_testFin(); // Au moins pour la langue d'origine		}		// Parcours des objets pour traductionfunction traduction_parcoursObj(obj, lngSource, lngDesti, childPosition)	{	//alert(obj.nodeValue + '/' + obj.nodeType + '/'+obj.nodeName +'/');	if (obj)		{		if (obj.nodeType==3)			{			// Prend les éléments texte non vides			if (obj.nodeValue)				{				if (typeof obj.nodeValue=='string' && 					obj.nodeValue!==null && 					obj.nodeValue.length>0 )					traduction_objet(obj, lngSource, lngDesti, childPosition);				}			}		else			{			for (var i=0;i<obj.childNodes.length;i++)				{				var enfant=obj.childNodes[i];								// Vérifie que l'objet n'est pas exclu des traductions				var estExclus=false;								// Exclus les scripts				if (enfant.nodeName.toLowerCase()=='script' ||					enfant.nodeName.toLowerCase()=='noscript') estExclus=true;								if (!(nonDef(enfant.id)) && !estExclus)					{					// Exclus les drapeaux					if (trad_objet[0]==enfant.id) estExclus=true;										var j=0;					while (j<trad_exclure.length && !estExclus)						{						if (trad_exclure[j]==enfant.id)							estExclus=true;						else							j++;						}					}								if (!estExclus)					traduction_parcoursObj (enfant, lngSource, lngDesti, i);				}			}		}	}	// Traduit la pagefunction traduction_objet(obj, lngSource, lngDesti, childPosition)	{		if (trad_listeObj.length<500)		{		// Vérifie si langue déjà stockée		var texte='';		var memoFaite=false;		if ( (obj.parentNode).getAttributeNode(trad_nomAttribut+childPosition))			{			texte=(obj.parentNode).getAttributeNode(trad_nomAttribut+childPosition).nodeValue;			memoFaite=true;			}		else			texte=obj.nodeValue;				// Vérifie si le texte contient un minimum de caractères corrects		texte=SupprimeCommentairesHTML(texte);		var texte2=caract_SupprCaractDebFin(texte, Array(' ', '\t', '\r', '\n', '\n'));		if (texte2!=='' && isNaN(texte) && typeof texte=='string')			{			//alert(lngSource+'/'+lngDesti);			// Vérifie si langue d'origine			if (lngDesti==lngSource)				{				if (memoFaite) obj.nodeValue=texte;				}			else				{				traduction_appelGere(lngSource, lngDesti, texte, false);				trad_EnCours_obj.push(Array(obj, childPosition, texte));				traduction_appelGere(lngSource, lngDesti, null, false);				}			}		}	}		// Regroupe les appels à la traduction	function traduction_appelGere(lngSource, lngDmdee, texteATester, opt_ForcerAppel)	{	if (lngDmdee==lngSource) return; // Pas de traduction		var faireAppel=false;	if (texteATester!==null)		{		// Appel avec un nouvel élément		//alert(typeof texteATester + '/' + texteATester);		if (trad_EnCours_taille+ (escape(trad_sep_deb+ trad_sep_fin).length)*trad_EnCours_obj.length +			escape(caract_HTML_encode(texteATester)).length > trad_tailleGetLimite+trad_tailleGetSansParam)			faireAppel=true;		}	else		{		if (trad_EnCours_obj.length>0)			trad_EnCours_taille+=escape(trad_EnCours_obj[trad_EnCours_obj.length-1][2]).length;		}			if ((faireAppel || opt_ForcerAppel) && trad_EnCours_obj.length>0)		{		trad_listeObj.push(trad_EnCours_obj);		trad_EnCours_obj=Array();		trad_EnCours_taille=0;		}	}			// Appel Google	function traduction_appel(numTrad, lngSource, lngDmdee)	{		// Concatène les textes à traduire	var texte='';	var texteEntree=trad_listeObj[numTrad];	for (var i=0; i<texteEntree.length;i++)		{		var texte2=texteEntree[i][2];		if (texte2.length>trad_tailleGetLimite) 			{			texte2=texte2.substring(0,trad_tailleGetLimite-3)+'...';			}		texte+=trad_sep_deb + caract_HTML_encode(texte2) + trad_sep_fin;		}				var adr='http://www.google.com/uds/Gtranslate' +		'?callback=traduction_retour'+		'&context=' + numTrad +		'&q=' + escape(texte) + ''+ 		'&langpair='+escape(lngSource+'|'+lngDmdee) +		'&key=notsupplied'+		'&encoding=notsupplied'+		'&v=1.0';	//prompt(texte,texte);	if (!navig_IE_6) obj_Detruit('traduction'+numTrad); // Plante méchamment IE6 en faisant  page précédente/page suivante	// Création de la nouvelle balise :    var script = document.createElement('script');    script.setAttribute('charset','UTF-8'); // Sinon Ffox ISO et IE7 UTF8	script.setAttribute('type', 'text/javascript');	script.setAttribute('language', 'JavaScript');	script.id = 'traduction'+numTrad;	script.src = adr;    //var objTrad=obj(trad_objet[0]);    //if (objTrad) objTrad.appendChild(script);		document.body.appendChild(script);		}	// Retour de traduction	function traduction_retour(numTrad, traduc, valRetour)	{	if (valRetour==200)		{		if (traduc['translatedText']!=='')			{			// Récupère les objets à traduire			var texte=traduc['translatedText'];						//   Crée un tableau comportant les différentes traduction			var listeTrad=Array();			var finListe=false;			var extrait;			while (!finListe && texte!=='')				{				var pos=texte.indexOf(trad_sep_fin);				if (pos==-1)					{					// Google tronque le dernier séparateur de fin...					extrait=texte.substring(trad_sep_deb.length, texte.length-trad_sep_deb.length);					listeTrad.push(extrait);										finListe=true;										}				else					{					extrait=texte.substring(trad_sep_deb.length,pos);					listeTrad.push(extrait);					texte=texte.substring(pos+trad_sep_fin.length, texte.length);// - (pos+trad_sep_fin.length));					}				}						// Parcours les objets pour fixer les traductions			var tabEntree=trad_listeObj[numTrad];			for (var i=0; i<tabEntree.length; i++)				{				var objet	=tabEntree[i][0];				var childPosition=tabEntree[i][1];				if (objet && listeTrad.length>i)					{					if (objet.parentNode)						{						if ( !(objet.parentNode).getAttributeNode(trad_nomAttribut+childPosition))							{							var texteSource=caract_SupprCaractDebFin(objet.nodeValue, Array('\r', '\n'));							(objet.parentNode).setAttribute(trad_nomAttribut+childPosition,texteSource);							}											var nouvTexte=caract_SupprCaractDebFin(listeTrad[i], Array('\r','\n'));						objet.nodeValue=caract_UNICODEversISO(caract_HTML_decode(nouvTexte));//conversionUnicode((nouvTexte));						}					}				}			}					}			if (!navig_IE_6) obj_Detruit('traduction'+numTrad); // Plante méchamment IE6 en faisant  page précédente/page suivante	trad_nbDemandes--;	traduction_testFin();	}	// Si traductions finies, réaffiche les drapeaux	function traduction_testFin()	{	if (trad_nbDemandes===0)		{		obj_Opacite_Fixe(obj('traductions'), 100);		trad_listeObj=Array(); // Vide la liste des éléments traduits				// Appelle la fonction si finies				if (trad_fnctApresTrad) trad_fnctApresTrad();		}		}			
