Les vues et la gestion des langues
Créez site2 en copiant site1.
- /cms
- site0
- site1
- site2
Dans ce chapitre, nous allons programmer comment une URL est analysée et distribuée dans des vues différentes selon la langue demandée.
Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site2 dans la barre d'adresse de votre navigateur. Terminez l'URL par /en pour afficher la page en anglais, par /fr pour la voir en français.
Créez le dossier views dans site2, puis les dossiers fr et en dans site2/views.
- /cms/site2
- includes
- library
- views
- fr
- en
Modifiez index.php après l'appel à bootstrap
:
- define('ROOT_DIR', dirname(__FILE__));
- set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . DIRECTORY_SEPARATOR . 'library');
- set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . DIRECTORY_SEPARATOR . 'includes');
- require_once 'dump.php';
- require_once 'bootstrap.php';
- bootstrap();
- require_once 'engine.php';
- dispatch($supported_languages); // see config.inc
index.php appelle la fonction dispatch
définie dans le fichier engine.php avec en argument la liste des langues gérées par le programme.
Ajoutez le paramètre $supported_languages
dans config.inc :
- global $supported_languages;
- $supported_languages=array('fr', 'en');
La première langue définie par $supported_languages
est la langue par défaut.
Le code d'une langue doit correspondre à un dossier dans views.
Ajoutez les fichiers engine.php, request_uri.php et locale.php dans le dossier library avec les contenus suivants :
- /cms/site2
- library
- engine.php
- requesturi.php
- locale.php
- library
- require_once 'requesturi.php';
- define('VIEWS_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'views');
Charge le code de la fonction request_uri
. Définit le dossier dans lequel les fichiers qui génèrent les vues sont regroupés.
- function dispatch($languages) {
dispatch
détermine comment générer le document correspondant à l'URL de la requête selon les langues supportées spécifiées par $languages
.
- global $base_path;
- $req = $base_path ? substr(request_uri(), strlen($base_path)) : request_uri();
- $url = parse_url($req);
- $path = isset($url['path']) ? trim(urldecode($url['path']), '/') : false;
- $query = isset($url['query']) ? $url['query'] : false;
- if (empty($path)) {
- $path = false;
- }
Retire le préfixe $base_path
de l'URL normalisée retournée par la fonction request_uri
. Extrait le chemin d'accès et les paramètres de la requête.
- /* site language */
- $p = $path ? explode('/', $path) : false;
- $lang = $p ? $p[0] : false;
- if ($lang && in_array($lang, $languages, true)) {
- array_shift($p);
- $path = implode('/', $p);
- }
- else {
- require_once 'locale.php';
- $lang=locale();
- if (!$lang or !in_array($lang, $languages, true)) {
- $lang = $languages[0];
- }
- }
Calcule la langue d'affichage du site. Si $path
commence par une des langues contenues dans $languages
, la langue est extraite de l'URL. Sinon, $lang
est mis à la valeur retournée par la fonction locale
si elle est supportée ou à défaut à la première langue listée dans $languages
.
- if (!$path)
- $path='home';
- $output=view($path, $lang);
- if ($output) {
- echo $output;
- }
- }
Prend la vue appelée home
par défaut.
Génère le document en appelant la fonction view
avec le nom de la vue et la langue en paramètres.
- function view($view, $lang=false) {
- $file = $lang ? VIEWS_DIR.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.$view.'.phtml' : VIEWS_DIR.DIRECTORY_SEPARATOR.$view.'.phtml';
- if (!file_exists($file)) {
- header('HTTP/1.0 404 Not Found');
- exit;
- }
- return render($file);
- }
view
localise le fichier correspondant à $view
selon la langue spécifiée par $lang
.
view
retourne le rendu du fichier.
Si aucun fichier n'est trouvé, view
renvoie un document d'erreur HTTP 404 Not Found.
- function render($file) {
- global $base_path, $base_url, $base_root;
- ob_start();
- require $file;
- return ob_get_clean();
- }
render
met les variables $base_path
, $base_url
et $base_root
dans le contexte global avant de charger le fichier $file
.
render
retourne le document généré par $file
.
- function request_uri() {
- if (isset($_SERVER['REQUEST_URI'])) {
- $uri = $_SERVER['REQUEST_URI'];
- }
- else {
- if (isset($_SERVER['argv'])) {
- $uri = $_SERVER['SCRIPT_NAME'] .'?'. $_SERVER['argv'][0];
- }
- elseif (isset($_SERVER['QUERY_STRING'])) {
- $uri = $_SERVER['SCRIPT_NAME'] .'?'. $_SERVER['QUERY_STRING'];
- }
- else {
- $uri = $_SERVER['SCRIPT_NAME'];
- }
- }
- $uri = '/'. ltrim($uri, '/');
- return $uri;
- }
request_uri
normalise le format de la requête passée dans une URL.
- function locale() {
- if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
- return false;
- }
- $httplanguages = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
- if (empty($httplanguages) === true) {
- return false;
- }
- $lang = false;
- $quality = 0.0;
- $accepted = preg_split('/,\s*/', $httplanguages);
- foreach ($accepted as $accept) {
- $match = null;
- $result = preg_match('/^([a-z]{1,8}(?:[-_][a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $accept, $match);
- if ($result < 1) {
- continue;
- }
- $q = isset($match[2]) ? (float) $match[2] : 1.0;
- if ($q > $quality) {
- $quality = $q;
- $lang = current(explode('_', current(explode('-', $match[1]))));
- if ($quality == 1.0) {
- break;
- }
- }
- }
- return $lang;
- }
locale
analyse la variable PHP $_SERVER['HTTP_ACCEPT_LANGUAGE']
pour en extraire la langue préférée de l'émetteur d'une requête HTTP.
La page d'accueil affiche une version en français et une version en anglais. Le contenu de chaque version est placé dans un fichier appelé home.phtml dans les dossiers fr et en du dossier views. Un fichier avec une extension .phtml contient du code HTML et un peu de code PHP limité à l'insertion de données calculées. Dans une vue, seule la présentation des données est prise en charge.
- /cms/site2
- views
- fr
- home.phtml
- en
- home.phtml
- fr
- views
Commencez par rédiger la version en français :
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Accueil</title>
- </head>
- <body>
- <h3>Bienvenue</h3>
- </body>
- </html>
Ajoutez la traduction en anglais :
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Home</title>
- </head>
- <body>
- <h3>Welcome</h3>
- </body>
- </html>
Essayez différentes adresses comme http://localhost/cms/site2, http://localhost/cms/site2/fr, http://localhost/cms/site2/en ou http://localhost/cms/site2/fr/nullepart.
Commentaires