A l'origine, ma classe permettait d'avoir les dates en 5 langues, mais elle était assez vite limitée et demandait un travail de traduction pout ajouter des langues, sans tenir compte de la problématique d'encodage des caractères.

<?php
abstract class Dates {
	/**
	 * Array of international months
	 * @static mixed
	 */
	static $months = array(
		'de' => array('Januar', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni', 'July', 'August', 'September', 'Oktober', 'November', 'Dezember'),
		'sp' => array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'),
		'fr' => array('Janvier', 'F&eacute;vrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Ao&ucirc;t', 'Septembre', 'Octobre', 'Novembre', 'D&eacute;cembre'),
		'it' => array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'),
		'en' => array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
	);
 
	/**
	 * Array of international days
	 * @static mixed
	 */
	static $days = array(
		'de' => array('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'),
		'sp' => array('Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'),
		'fr' => array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'),
		'it' => array('Domenica', 'Luned&igrave;', 'Marted&igrave;', 'Mercoled&igrave;', 'Gioved&igrave;', 'Venerd&igrave;', 'Sabato'),
		'en' => array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
	);
 
	/**
	 * Returns a translated and formated date
	 * @param integer Timestamp to use
	 * @param string Formating to use
	 * @param string language to use
	 * @return string The new string date
	 */
	function uts2date($timestamp, $format='d/m/Y', $lg='fr') {
		$mydate = date($format, $timestamp);
		if ($lg!='en') {
			if (array_key_exists($lg, Dates::$months)) {
				$mydate = str_replace(Dates::$months['en'], Dates::$months[$lg], $mydate);
				$mydate = str_replace(Dates::$days['en'], Dates::$days[$lg], $mydate);
			}
		}
		return $mydate;
	}
}
?>

Heureusement, il existe une alternative en utilisant les variables locales du serveur, il suffit que les jeux de langues soient installés:

<?php
abstract class Dates {
	/**
	 * Array of international codes
	 * @static mixed
	 */
 
	static $locales = array(
		'de' => 'de_DE.utf8',
		'sp' => 'sp_SP.utf8',
		'fr' => 'fr_FR.utf8',
		'it' => 'it_IT.utf8',
		'en' => 'en_US.utf8'
	)
 
	/**
	 * Returns a translated and formated date
	 * @param integer Timestamp to use
	 * @param string Formating to use
	 * @param string language to use
	 * @return string The new string date
	 */
	function uts2date($timestamp, $format='d/m/Y', $lg='fr') {
		setlocale(LC_ALL, Dates::$locales[$lg];
		$mydate = date($format, $timestamp);
		return $mydate;
	}
}
?>

La simplification est plus que visible, tant au niveau des définitions des langues qu'au niveau de la fonction.
Le tableau $locales permet de choisir le jeu de caractères utilisé. Le choix de l'UTF8 est totalement arbitraire, mais c'est celui qui me semble le plus logique pour un site international.

Si vous désirez connaitre les langues installées sur votre serveur (sous linux), utilisez:

locale -a