symfony i18n
terminologie internationalization = i18n –Un même contenu traduit en plusieurs langue, éventuellement converti en différents formats localization = l10n –Contient un contenu différent selon le pays à partir duquel le site est consulté
Culture utilisateur La culture est une combinaison du pays et de la langue de lutilisateur –Persistante en session Culture par défaut myapp/config/i18n.yml all: default_culture: fr_FR Pour que les changements prennent effet –Réinitialiser la session (supprimer les cookies, « effacer mes traces ») La langue est codée sur 2 caractères minuscules (ISO standard) Le pays est codé sur 2 caractères majuscules (ISO standard)
Changer de culture // Culture setter $this->getUser()->setCulture('en_US'); // Culture getter $culture = $this->getUser()->getCulture(); en_US La culture étant stockée dans la session les Moteur de recherche ne peuvent indexer quune langue
Culture dans url routing.yml page: url: /:sf_culture/:page requirements: { sf_culture: (?:fr|en|de) } params:... article: url: /:sf_culture/:year/:month/:day/:slug requirements: { sf_culture: (?:fr|en|de) } params:... La culture sera accolé dans chaque url générée par link_to Si le paramètre sf_culture change dans lurl symfony changera automatiquement la culture de lutilisateur
Déterminer la culture $languages = $this->getRequest()->getLanguages(); Permet de déterminer automatiquement la culture le Accept-Language HTTP nest pas très fiable –Rarement modifié par les utilisateurs –La plupart du temps le langage est celui de linterface –Les browsers ne sont pas disponibles dans toutes les langues –Lutilisateur doit pouvoir choisir une autre langue
Affichage des données fonction de la culture setCulture('en_US') ?> '12,000.10' setCulture('fr_FR') ?> '12 000,10' Pas de passage explicite de la culture
Affichage des données fonction de la culture II '9/14/06' 'September 14, :11:07 PM CEST'
Affichage des données fonction de la culture III 'United States' 'English'
Affichage des données fonction de la culture IV Afghanistan... United Kingdom United States United States Minor Outlying Islands Uruguay... Les helpers date acceptent un paramètre spécifique pour forcer la culture déconseillé
Récupérer des données localisées $date= $this->getRequestParameter('birth_date'); $user_culture = $this->getUser()->getCulture(); // Getting a timestamp $timestamp = sfI18N::getTimestampForCulture($date, $user_culture); // Getting a structured date list($d, $m, $y) = sfI18N::getDateForCulture($date, $user_culture);
Schéma localisé my_product: _attributes: { phpName: Product, isI18N: true, i18nTable: my_product_i18n } id: { type: integer, required: true, primaryKey: true, autoincrement: true } price: { type: float } my_product_i18n: _attributes: { phpName: ProductI18n } id: type: integer required: true primaryKey: true foreignTable: my_product foreignReference: id culture: { isCulture: true, type: varchar, size: 7, required: true, primaryKey: true } name: { type: varchar, size: 50 }
Schéma localisé – version courte my_product: _attributes: { phpName: Product } id: price: float my_product_i18n: _attributes: { phpName: ProductI18n } name: varchar(50)
Utilisation dun objet localisé $product = ProductPeer::retrieveByPk(1); $product->setCulture('fr'); $product->setName('Nom du produit'); $product->save(); $product->setCulture('en'); $product->setName('Product name'); $product->save(); echo $product->getName(); 'Product name' $product->setCulture('fr'); echo $product->getName(); 'Nom du produit'
Automatiser la localisation dun objet Ajouter cette méthode au modèle public function hydrate(ResultSet $rs, $startcol = 1) { $user = sfContext::getInstance()->getUser(); $culture = $user->getCulture(); $this->setCulture($culture); return parent::hydrate($rs, $startcol); }