Rediriger vers un article de Wikipédia dans la langue du visiteur

Voici un petit script en PHP qui redirige le visiteur vers un article de Wikipédia dans sa langue.

Voici mon problème : en créant le site du cours d’espéranto d’été 2019, j’ai trouvé que c’était une bonne idée de mettre des liens vers Wikipédia pour que les visiteurs puissent en savoir plus sur la ville de l’événement (Nitra en Slovaquie) ou sur les lieux où seront les excursions. Seulement voilà : le site est multilingue. J’avais donc trois solutions :

  • mettre un simple lien vers Wikipédia en espéranto et laisser au visiteur le soin de chercher si la page existe dans sa langue ;
  • laisser les traducteurs chercher le lien vers la version dans leur langue de Wikipédia (sans être sûr qu’ils comprennent ce qu’il faut faire) ;
  • trouver un moyen pour qu’un même lien redirige le visiteur vers l’article de Wikipédia dans sa langue.

J’ai donc un peu creusé l’API de Wikidata pour mettre en œuvre la troisième option. Voilà le résultat :

<?php
$languesource = 'fr'; // Par défaut : français
$languecible = 'en'; // Par défaut : anglais
if (isset($_GET['languecible']))
{
	$languecible = $_GET['languecible'];
}
elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{
	$langues_navigateur = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	$matches = array();
	preg_match('!^([a-z]+)!i', $langues_navigateur[0], $matches);
	if (isset($matches[1]))
		$languecible = $matches[1];
}

if (isset($_GET['q']))
{
	$q = $_GET['q'];
	if (substr($q, 0, 1) != 'Q')
		$q = 'Q' . $q;
}
else
{
	$languesource = isset($_GET['languesource']) ? $_GET['languesource'] : $languesource;
	$article = isset($_GET['article']) ? $_GET['article'] : '';

	$article = rawurlencode($article);

	$url = 'https://' . $languesource . '.wikipedia.org/w/api.php?action=query&prop=pageprops&ppprop=wikibase_item&redirects=1&format=json&titles=' . $article;

	$wp = json_decode(file_get_contents($url), true);
	$q = current($wp['query']['pages'])['pageprops']['wikibase_item'];
}

$url = 'https://www.wikidata.org/wiki/Special:EntityData/' . $q . '.json';
$wikidata = json_decode(file_get_contents($url), true);

if (isset($wikidata['entities'][$q]['sitelinks'][$languecible . 'wiki'])) // L'article existe dans la langue cible
	header('Location: ' . $wikidata['entities'][$q]['sitelinks'][$languecible . 'wiki']['url']);
elseif (isset($wikidata['entities'][$q]['sitelinks'][$languesource . 'wiki'])) // L'article existe dans la langue source
	header('Location: ' . $wikidata['entities'][$q]['sitelinks'][$languesource . 'wiki']['url']);
else // L'article n'existe pas dans la langue source
	header('Location: https://' . $languesource . '.wikipedia.org/wiki/');
?>

Il suffit d’appeler la page avec quelques paramètres dans l’URL. Le principe est assez simple :

  • Le paramètre q contient l’identifiant Wikidata de la page (par exemple Q726 pour « Cheval »).
  • S’il n’est pas fourni, le script va chercher l’identifiant de la page (paramètre article) dans la langue source (paramètre languesource, par défaut le français).
  • Le script récupère les informations sur l’élément Wikidata.
  • S’il existe un article Wikipédia dans la langue cible (paramètre languecible, s’il n’est pas présent, on prend la première langue dans les paramètres du visiteur, et si ce n’est pas possible, c’est par défaut l’anglais), rediriger vers celui-ci.
  • Si cet article n’existe pas, mais qu’il existe dans la langue source, alors on redirige vers cette page-là.
  • Sinon, on redirige simplement vers la page d’accueil de Wikipédia dans la langue source.

Mon implémentation est à l’adresse https://ses.ikso.net/2019/fr/vikipedio.php (j’ai juste changé les noms des paramètres et les langues par défaut, mais ça reste le même principe). Par exemple :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.