Une date (plus ou moins) floue

Plutôt que la précision ultime du robot de blog, ou au contraire le flou choisi par exemple par Flickr, une voie moyenne selon la distance entre la date (#DATE) et la date courante.

Le principe

Quand on veut présenter une date, on est souvent face à un choix assez binaire :

  • soit on fournit à nos visiteurs une date exacte, un peu comme un robot, jour-mois-année ;
  • soit on veut assouplir la présentation pour la rendre plus humaine, et c’est là qu’intervient la notion de « date floue » [1] : « aujourd’hui », « hier », « avant-hier », « la semaine dernière », « le mois dernier », « il y a 5 mois », etc.

Le problème des dates floues c’est que souvent elles sont complètement floues, autrement dit elles nous forcent à un travail de reconstruction pour comprendre de quel moment on nous parle en réalité (c’est ce qui m’ennuie sur Flickr notamment, parce que « il y a 59 mois » ne me parle plus du tout). Disons que je suis assez rapidement face à une limite à l’abstraction des dates.

L’idée de ce filtre est donc de jouer sur les deux tableaux :

  1. si la date est très récente (moins d’une semaine) alors afficher une chaîne relative à la date d’aujourd’hui (« aujourd’hui », « hier », « mardi dernier », etc.) ;
  2. si la date est plus ancienne, alors retombons sur nos pattes avec une date classique, qui nous évite le fastidieux travail de conversion.

Le code du filtre

Vous allez voir, ce n’est pas sorcier. Tout s’appuie sur une soustraction.

Note liminaire : pourquoi commenter en anglais ? Parce que je crois à l’internationalisation de la documentation.

Ajoutez ce code à votre fichier mes_fonctions.php :

/**
 * nb_FuzzyDate
 * donne des dates plus sympas par exemple dans les forums
 * @return $date formatée sous forme de date plus ou moins floue
 * @param $date Object
 * marche bien sur http://www.nota-bene.org/ :)
 */
function nb_FuzzyDate($date) {
	if($date!='') {
		// this is now
		$now = date("U");
		// a day is 
		$oneday = 3600 * 24;

		// reconstructing a 'clean' date from what's in the database
		$test_date = preg_match_all(",[0-9]*,",$date,$matches);
		$Y = $matches[0][0];
		$M = $matches[0][2];
		$D = $matches[0][4];
		$computed = date("U", mktime(0,0,0,$M,$D,$Y) );
		
		// $diff is the number of days between $now and $computed
		$diff = floor(($now-$computed)/$oneday);

		// conditionally setting $date
		if($diff < 1) { // then it's today
			$date = _T('fuzzy_today');
		} else if($diff < 2) { // then it's yesterday
			$date = _T('fuzzy_yesterday');
		} else if($diff < 7) { // then it's last {weekday}
			$date = _T('fuzzy_last_w' . date("w",$computed) );
		} else { // too old: resorting to classical affdate display
			$date = affdate($date);
		}
	}
	return $date;
}

Les chaînes de localisation

Il nous reste à ajouter à squelettes/lang/local_*.php les petites chaînes qui vont bien :

En français dans squelettes/lang/local_fr.php :

$GLOBALS[$GLOBALS['idx_lang']] = array(

	'fuzzy_today' => 'aujourd\'hui',
	'fuzzy_yesterday' => 'hier',
	'fuzzy_last_w0' => 'dimanche dernier',
	'fuzzy_last_w1' => 'lundi dernier',
	'fuzzy_last_w2' => 'mardi dernier',
	'fuzzy_last_w3' => 'mercredi dernier',
	'fuzzy_last_w4' => 'jeudi dernier',
	'fuzzy_last_w5' => 'vendredi dernier',
	'fuzzy_last_w6' => 'samedi dernier'

); // end array

Et en anglais dans squelettes/lang/local_en.php :

$GLOBALS[$GLOBALS['idx_lang']] = array(

	'fuzzy_today' => 'today',
	'fuzzy_yesterday' => 'yesterday',
	'fuzzy_last_w0' => 'last Sunday',
	'fuzzy_last_w1' => 'last Monday',
	'fuzzy_last_w2' => 'last Tuesday',
	'fuzzy_last_w3' => 'last Wednesday',
	'fuzzy_last_w4' => 'last Thursday',
	'fuzzy_last_w5' => 'last Friday',
	'fuzzy_last_w6' => 'last Saturday'

); // end array

(je vous invite à traduire dans d’autres langues, mon site n’a besoin que de ces deux-là).

Voilà, c’est tout...

Il vous suffira aux endroits où vous voulez mettre ce filtre, de le noter comme suit : [(#DATE|nb_FuzzyDate)].

Et demain, aujourd’hui sera hier, comme on dit.

Notes

[1Épatez vos amis : en anglais on dit « fuzzy date ». Ça sonne quand même super bien, non ?

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom