Traducteur de blabla

Cet autre exemple simple va créer un petit formulaire demandant à un service externe de traduire un contenu qui lui est envoyé. Le résultat sera affiché sous le texte saisi.

Le formulaire sera nommé « traduire_blabla » et pourra donc être appelé dans un squelette par la balise #FORMULAIRE_TRADUIRE_BLABLA ou dans un article par <formulaire|traduire_blabla>.

Il fonctionne comme la plupart des formulaires CVT avec deux fichiers :

  • formulaires/traduire_blabla.html pour la partie HTML
  • formulaires/traduire_blabla.php pour les fonctions d’analyse et de traitement PHP.

Squelette HTML

Le squelette du formulaire recevra deux champs de saisie de type textarea : le premier pour écrire le contenu à traduire, le second pour afficher le résultat de la traduction une fois le calcul effectué. Ce second champ n’est affiché que s’il est renseigné.

<div class="formulaire_spip formulaire_#FORM">

[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]

<form action="#ENV{action}" method="post"><div>
	#ACTION_FORMULAIRE{#ENV{action}}
	<ul>
		[(#SET{erreurs,[(#ENV**{erreurs}|table_valeur{traduire})]})]
		<li class="editer_traduire obligatoire[ (#GET{erreurs}|oui)erreur]">
			<label for="traduire">Traduire</label>
			[<span class='erreur_message'>(#GET{erreurs})</span>]
			<textarea name='traduire' id='champ_traduire'>#ENV{traduire}</textarea>
		</li>
		[
		[(#SET{erreurs,[(#ENV**{erreurs}|table_valeur{traduction})]})]
		<li class="editer_traduction[ (#GET{erreurs}|oui)erreur]">
			<label for="traduction">Traduction</label>
			[<span class='erreur_message'>(#GET{erreurs})</span>]
			<textarea name='traduction' id='champ_traduction'>(#ENV{traduction})</textarea>
		</li>
		]
	</ul>
	<p class="boutons"><input type="submit" class="submit" value="Traduire" /></p>
</div></form>
</div>

Les deux champs se nomment « traduire » et « traduction ». Le même squelette pourrait écrire avec le plugin « Saisies » le contenu entre <ul> et </ul> de la sorte :

<ul>
	[(#SAISIE{textarea, traduire, obligatoire=oui, label=Traduire})]
		
	[(#ENV{traduction}|oui)
		[(#SAISIE{textarea, traduction, label=Traduction})]
	]
</ul>

Chargement, vérifications et traitements

La fonction « charger » du formulaire, déclarée dans le fichier formulaires/traduire_blabla.php doit indiquer qu’elle ajoute ces deux champs « traduire » et « traduction » dans le contexte du squelette :

function formulaires_traduire_blabla_charger_dist() {
	$contexte = array(
		'traduire' => '',
		'traduction' => '',
	);
	return $contexte;
}

La fonction « vérifier » a simplement besoin de tester si du contenu a bien été saisi dans le champ « traduire » et dans le cas contraire retourner une erreur :

function formulaires_traduire_blabla_verifier_dist() {
	$erreurs = array();
	if (!_request('traduire')) {
		$erreurs['message_erreur'] = "Vous avez oublié d'écrire ! Votre clavier est cassé ?";
		$erreurs['traduire'] = "C'est là dedans qu'on écrit son texte !";
	}
	return $erreurs;
}

C’est à partir de la fonction « traiter » que les choses se compliquent un peu. Il va falloir envoyer le contenu à un service distant (on utilisera Google Translate dans cet exemple), récupérer et traiter l’information retournée, puis la faire afficher dans le formulaire.

Pour ce faire, le script commence par calculer l’URL du service distant basée sur l’API de celui-ci. On utilise la fonction PHP de SPIP parametre_url pour ajouter proprement des variables à l’URL du service. Grâce à une autre fonction, recuperer_page qui permet de récupérer le code retourné par l’appel d’une URL, le retour du service est stocké dans la variable $trad.

Le service retournant des données formatées en JSON, il faut les décortiquer (fonction json_decode). En fonction du retour, la traduction est réussie ou non. Le message est adapté en conséquence.

// http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello%20world&langpair=en%7Cit
define('URL_GOOGLE_TRANSLATE', "http://ajax.googleapis.com/ajax/services/language/translate");

function formulaires_traduire_blabla_traiter_dist() {

	// creer l'url selon l'api google
	$texte = _request('traduire');
	$url = parametre_url(URL_GOOGLE_TRANSLATE, 'v', '1.0', '&');
	$url = parametre_url($url, 'langpair', 'fr|en', '&');
	$url = parametre_url($url, 'q', $texte, '&');

	// chargement du texte traduit par google (retour : json)
	include_spip('inc/distant');
	$trad = recuperer_page($url);

	// attention : PHP 5.2
	$trad = json_decode($trad, true); // true = retour array et non classe

	// recuperation du resultat si OK
	if ($trad['responseStatus'] != 200) {
		set_request('traduction', '');
		return array(
			"editable" => true,
			"message_erreur" => "Pas de chance, faux retour de l'ami Google !"
		);
	}

	// envoi au charger
	set_request('traduction', $trad['responseData']['translatedText']);

	// message
	return array(
		"editable" => true,
		"message_ok" => "Et voilà la traduction !",
	);
}

La fonction set_request() force le stockage d’une valeur de variable qui pourra être récupérée par _request(). Ainsi le prochain chargement du formulaire peut récupérer la valeur du champs « traduction » pour l’envoyer dans le contexte du squelette.

Note : Il est possible qu’une méthode plus propre soit développée dans de prochaines versions de SPIP pour faire transiter des données entre le traitement et le chargement via un nouveau paramètre au tableau de retour du traitement.

Auteur Matthieu Marcillaud Publié le : Mis à jour : 12/03/23

Traductions : English, français