Internationalisation
CrazyCat » 17/ 02/2009 09:01
PHP
|
Envoyer à un ami |
Fil des commentaires de ce billet
Rendre un script multi-langue est souvent un casse-tête qui oblige à passer par des tableaux de variables et qui peut rendre le système très lourd. Heureusement, il y a des astuces qui peuvent aider si la configuration du serveur est adéquate.
J'ai rencontré cette problématique avec une classe de traitements de dates que j'ai faite, et voici ce que ça peut donner.
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ä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évrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Dé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ì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', '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