J'ai besoin d'afficher à l'utilisateur une liste de noms de jours localisés (comme "lundi", "mardi", ...) dans un formulaire. Je sais comment obtenir le nom du jour de n'importe quelle date. Mais existe-t-il un moyen particulier et infaillible d’obtenir les noms de tous les jours dans un tableau?
Edit: Je pourrais ajouter des noms de jours à mon fichier de traduction mais cela est difficile à maintenir.
L'utilisation de strftime()
en combinaison avec setlocale()
est une option.
Cependant, vous devez savoir que sur les installations php threadées, setlocale()
peut se comporter de manière inattendue, car les informations sur les paramètres régionaux sont conservées par processus, et non par thread. Par conséquent, il est important d’appeler setlocale()
à chaque fois avant chaque appel vers strftime()
afin de vous assurer qu’il utilise les paramètres régionaux appropriés.
De plus, pour les systèmes Windows, vous devez utiliser des chaînes quelque peu inhabituelles pour le paramètre $locale
pour setlocale()
.
Consultez la documentation pour plus d'informations sur ces deux problèmes.
Quelque chose comme ça devrait marcher:
// define the locales for setlocale() for which we need the daynames
$locales = array(
'en_EN',
'de_DE',
'nl_NL'
// etc...
);
// be aware that setlocale() needs different values on Windows machines
// see the docs on setlocale() for more information
$locales = array(
'english',
'german',
'dutch'
// etc...
);
// let's remember the current local setting
$oldLocale = setlocale( LC_TIME, '0' );
// initialize out result array
$localizedWeekdays = array();
// loop each locale
foreach( $locales as $locale )
{
// create sub result array for this locale
$localizedWeekdays[ $locale ] = array();
// 7 days in a week
for( $i = 0; $i < 7; $i++ )
{
// set the locale on each iteration again
setlocale( LC_TIME, $locale );
// combine strftime() with the nifty strtotime()
$localizedWeekdays[ $locale ][] = strftime( '%A', strtotime( 'next Monday +' . $i . ' days' ) );
// reset the locale for other threads, as a courtesy
setlocale( LC_TIME, $oldLocale );
}
}
// there is your result in a multi-dimensional array
var_dump( $localizedWeekdays );
$date = '2011/10/14';
$day = date('l', strtotime($date));
echo $day;
$dayNames = array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
);
Est-ce assez à l'abri :)
Sur une note plus sérieuse, les goûts de PHPBB le font en définissant des fichiers de localisation et un codage en dur pour différentes langues. C'est vraiment le seul moyen de le faire de manière fiable.
Je recommanderais de télécharger quelque chose comme ça et de regarder le code pour voir comment c'est fait.
La méthode "habituelle" consiste à commencer par un last day
donné et à compter un jour à chaque itération.
for ($i = 0; $i < 7; $i++) {
$weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}
setlocale(LC_TIME, 'de_DE');
$today = ( 86400 * (date("N")) );
for( $i = 0; $i < 7; $i++ ) {
$days[] = strftime('%A', time() - $today + ($i*86400));
}
print_r($days);
Évidemment, on peut optimiser en n'appelant pas time () 7 fois, etc., mais c'est le Gist. Il vous donne la bonne langue pour les paramètres régionaux et maintient en ordre l’ordre Sun-Sat du tableau.
Je sais que ça fait longtemps, mais qu'en est-il:
$timestamp = strtotime('next Sunday');
$days = array();
for ($i = 0; $i < 7; $i++) {
$days[] = strftime('%A', $timestamp);
$timestamp = strtotime('+1 day', $timestamp);
}