Afficher les dates en français

Nous allons définir la configuration locale grâce à la fonction PHP setlocale(), et ce en fonction de l’environnement : développement ou production.

1. Définition de la configuration locale

La fonction PHP setlocale() permet de modifier les informations de localisation de notre application. Elle prend en paramètre la catégorie de fonctions affectée, et le nom de la locale.

Plus d’information sur la fonction setlocale() sur le site officiel PHP

Le nom de la locale dépend du système d’exploitation, c’est pourquoi nous allons faire une double configuration automatique selon l’environnement du site. Nous allons définir la configuration locale dans le fichier {app}/config/bootstrap.php, et faire un test sur l’adresse IP à l’origine de la requête comme expliqué dans un autre sujet.

1
2
3
4
5
6
7
8
9
10
11
12
13
// {app}/config/bootstrap.php
if(env('REMOTE_ADDR') == '127.0.0.1')
{
  // Local (Windows dans notre cas)
  $locale = 'french';
}
else
{
  // En ligne
  $locale = 'fr_FR';
}
// Définition de la locale pour toutes les fonctions php relatives à la de gestion du temps :
setlocale(LC_TIME, $locale);

2. Affichage d’une date

Voyons l’effet de notre configuration : imaginons un blog avec des articles dont nous voulons afficher la date de création. Dans la Vue de l’action view :

1
2
3
4
5
6
7
8
// {app}/views/articles/view.ctp
 
// Le titre de l'article :
e($article['Article']['titre'].'<br />');
 
// Date de création :
$timestamp = strtotime($article['Article']['created']);
e("Créé le ".strftime("%d %B %Y à %H:%M", $timestamp));

Notre vue affiche bien :

Mon premier article
Créé le 12 février 2008 à 19h51

3. Les champs date dans un formulaire

Autre effet de notre configuration : lorsque nous créons un formulaire avec un champ date (sous forme de 3 listes déroulantes pour le jour, le mois et l’année), nous aimerions que les mois de l’année soient affichés en français et que les champs soient présentés dans l’ordre “jour - mois - année” et non pas “mois - jour - année” comme en anglais.

Dans la Vue de l’action edit :

1
2
3
4
// {app}/views/articles/edit.ctp
e($form->create('Article', array('action' => 'edit')));
e($form->input('created', array('dateFormat' => 'DMY', 'label' => 'Date de création')));
e($form->end('Valider'));

Nous avons précisé l’ordre dans lequel nous souhaitions voir apparaître les 3 listes déroulantes grâce à l’option dateFormat, et grâce à notre définition de la locale, la liste déroulante du milieu, celle des mois de l’année, montre bien les mois en français.

Pierre-Emmanuel Fringant

Commentaires

Bonjour,

Merci pour ce tutoriel mais comment mettre en francais la fonction du helper time : timeAgoInWords ?
Merci

La méthode timeAgoInWords retourne une chaîne directement construite en anglais dans la méthode, la seule solution est de créer un nouveau helper et de recopier la fonction en changeant son comportement.

On peut aussi ajouter derrière la locale le codage des caractères, celui du système est parfois différent de celui de l’application. Par exemple pour forcer latin1 sur un système en utf-8, on fera setlocale(’fr_FR.ISO8859-1′);

Il existe également d’autres constantes que LC_TIME pour les nombres, les comparaisons de chaînes etc

Pour plus d’infos (surtout dans les commentaires) : http://fr.php.net/manual/fr/function.setlocale.php

Salut,

Et encore bravo pour ton blog, qui est de loin le plus utile et le plus clair de la communauté française du Gâteau !

La possibilité de définir la locale dans Bootstrap est récente je crois, car il y a encore quelques semaines, il m’avait fallu créer un Helper LocaleTime pour gérer l’affichage des dates dans d’autres formats que l’anglo-américain…

C’est donc une bonne nouvelle et je vais de ce pas jeter mon helper dans la corbeille !

Avairet

Merci pour tes encouragements !

Me revoilà !

J’ai repris mon helper LocalTime pour voir comment j’avais fait et je pense que l’on peut faire plus rapide et non dépendant de la machine :

$locale = ‘fr_FR’;
if (strpos(”Win”, $_SERVER["HTTP_USER_AGENT"]))
{
$locale = ‘fra’;
}
setlocale(LC_TIME, $locale);

Je me corrige, ce n’est pas dépendant de l’IP, mais bien de l’OS…

Salut,

Je reviens sur ce sujet, car j’ai testé ta méthode et dans mon formulaire, le nom des mois est toujours en anglais…
Voici ce que j’ai mis dans mon fichier bootstrap.php :

$locale = ‘fr_FR’;
if (isset($_SERVER['HTTP_USER_AGENT']) && strpos(”Win”, $_SERVER['HTTP_USER_AGENT']))
{
$locale = ‘french’;
}
setlocale(LC_TIME, $locale);

Tu t’étais pourtant corrigé toi-même dans un commentaire précédent : la locale ne dépend pas du client.
$_SERVER[’HTTP_USER_AGENT’] te donne le nom du navigateur d’un visiteur, alors que la locale doit être définie en fonction de l’environnement du serveur.
Je reconnais que le nom $_SERVER pour récupérer des infos sur le visiteur est très mal choisi et prête à confusion, la preuve !

Holà, mais pourtant, j’ai utilisé la même chose dans mon Helper “localtime” que j’avais bidouillé il y a quelques semaines pour obtenir le même résultat que toi… et je n’avais aucun souci !

Dans nos exemples, ce qui compte, c’est “setlocale(LC_TIME, $locale)”, non ?

Donc apparemment, ce qui bloque, c’est que je suis sous Windaube et que ma locale “french” n’est pas prise en compte du fait de l’utilisation de $_SERVER ??

Mais pourtant, le fichier “bootstrap.php” est appelé dès que je fait une requête depuis mon navigateur…

Bon OK, je viens d’ajouter :

“if (env(’REMOTE_ADDR’) == ‘127.0.0.1′ || ” au début de mon test

et cela fonctionne, par contre, j’ai un souci d’accents dans “février”, pour mon helper Localtime, j’avais donc ajouter :

$date_format = strftime($format,$date);

$date_format = iconv(’ISO-8859-1′, ‘UTF-8′, $date_format);

Mais ces ajouts ne peuvent pas se faire dans le “bootstrap” et ni dans le “form->input()”…

Donc si on utilise de l’utf-8, on ne peut pas utiliser tel quel ton exemple ? On doit forcément réécrire la méthode input du helper Form ou bien créer comme moi un autre helper…

Relis le commentaire de Matthieu (n°3) : tu peux ajouter le codage des caractères après la locale :
setlocale(’fr_FR.ISO8859-1′);
ou
setlocale(’fr_FR.UTF-8′);

Oups, oui désolé, j’avais oublié le commentaire de Matthieu…

Mais je viens de tester et cela ne marche pas chez moi ?!

Que je fasse :
set_locale(LC_TIME, ‘fr_FR.UTF-8′)
ou
set_locale(LC_TIME, ‘fr_FR.ISO-8859-1′)
ou
set_locale(LC_TIME, ‘french.UTF-8′)

En fait, dès que j’ajoute quelque chose derrière la locale, il me remet les noms des mois en anglais dans mes formulaires. D’après la doc PHP et les commentaires des users, il semble que l’ajout du Charset après la locale ne fonctionne pas sous Windows.

Parfois, l’affichage des noms de mois repasse en Anglais à la volée, c’est comme si bootstrap.php n’était pas toujours lu… J’ai essayé de faire mon set_locale à différents endroits, sans succès. Un simple F5 (refresh) de la page en cours remet les noms en français, mais c’est tout de même pas terrible pour le client…
As-tu constaté ce genre de choses ?

Pour ma part, jamais.
Le bootstrap reste le meilleur endroit pour définir la locale.

Alors d’où peut provenir ce problème ? Je précise que cela se produit essentiellement dans des champs date produit par le helper Form.

C’est très aléatoire et fort désagréable à l’usage…

Participez