Localisation des dates dans Kirby à partir de php 8.1
J’essaye de prendre l’habitude, à chaque fois que je galère à faire quelque chose (comme configurer ma bibliothèque avec calibre web) parce que les informations sont dispersées sur plusieurs sources, de le documenter ici pour retrouver facilement l’info plus tard, et pour potentiellement aider d’autres personnes.
Donc voici un petit article pour documenter mon problème du jour :
En haut de chacun de mes articles, j’affiche la date de publication, sous ce format : « 2 février 2025 ». Par défaut, les dates sont écrites en anglais en PHP.
Voici la méthode que j’utilisais jusqu’à aujourd'hui pour afficher le mois en toutes lettres en français :
<?php setlocale(LC_TIME, "fr_FR");
$laDate = $page->date()->toDate();
echo utf8_encode(strftime("%e %B %Y", $laDate)); ?>
Je trouve déjà ça bien compliqué pour juste afficher une date en français, mais 🤐
Le problème est qu’à partir de PHP 8.1, strftime est deprecated, il faut donc changer de méthode. Donc après moult recherches et tests, voici une solution :
-
Dans le fichier de config de Kirby, ajoutez cette option (cf. la doc) :
'date' => [ 'handler' => 'intl' ]
-
Ensuite, chez votre hébergeur, activez l’extension php intl. Chez Alwaysdata, il faut ajouter ça dans le custom php.ini de votre site (cf. la doc) :
extension = intl.so
-
Enfin, dans votre code, ajoutez ça (cf. ici et là) :
$laDate = $page->date()->toDate(); $formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT); $formatter->setPattern('d MMMM yyyy'); echo $formatter->format($laDate);
-
Si vous voulez utiliser plusieurs langues sur votre site, il vous suffira de modifier cette ligne pour utiliser automatiquement votre locale actuelle :
$formatter = new IntlDateFormatter($kirby->language()->locale(LC_ALL), IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
Il y a probablement une solution plus élégante, mais celle-ci fonctionne, elle me suffit donc pour l’instant ! J’éditerai si je trouve mieux.