Suite ...
Utiliser des chunks pour chaque string à localiser est possible mais pas très pratique (bcp de petits chunks, un pour chaque langue). À la place j’ai mis les string dans un fichier unique placé à la base du site: fr.lang.php.
Pour faire un site multi-lingue, j’ai donc préparé
- un template
- un fichier fr.lang.php contenant tout le texte dans un tableau
- les pages du site dans un folder fr, basées sur le template
- un snippet qui charge le fichier langue
- un snippet qui fournit un texte localisé à partir de son id
Au début du template général du site j’exécute le snippet qui charge le fichier :
// chemin vers la base du site
$basePath = $modx->config['base_path'];
// langue du document, déterminée par le début de son arborescence
$lang = getRootAlias($modx);
//chargement du fichier correspondant à la langue
$filelang = $basePath.'/'.$lang.'.lang.php';
if (file_exists($filelang)) include($filelang);
//renvoie l'alias du premier folder
//par exemple si le document actuel est /fr/oui/non.html
//la fonction renverra 'fr'
function getRootAlias($modx) {
$parentId=$modx->documentObject['id'];
do {
$thisId=$parentId;
// Get published or unpublished parent
$thisDoc=$modx->getDocument($thisId,'parent',1,0) ? $modx->getDocument($thisId,'parent',1,0) : $modx->getDocument($thisId,'parent',0,0);
$parentId = $thisDoc['parent'];
} while ($parentId!=0);
$thisDoc=$modx->getDocument($thisId);
return $thisDoc['alias'];
//return $thisId;
}
Ensuite chaque fois que j’ai besoin d’afficher un string j’appelle le snippet ’lang’ de la sorte [[lang?id=iddutexte]]
//$GLOBALS['insina'] est le tableau contenant le texte du site
//chargé lors du premier snippet
return $GLOBALS['insina'][$id];
Une fois que la version française fonctionne bien, je n’ai plus qu’à ajouter le fichier en.lang.php contenant la version anglaise, copier le folder ’fr’ dans l’administration MODx et renommer ce folder ’en’, j’ai aussitôt une version anglaise fonctionnelle.
Pour rediriger automatiquement le visiteur vers sa langue préférée on peut utiliser un document dans la racine du site appelant le snippet ’redirect’
$lang = getenv('HTTP_ACCEPT_LANGUAGE');
switch (substr($lang,0,2)) {
case 'fr':
header("Location: /fr/");
break;
case 'en':
default:
header("Location: /en/");
break;
}
voir résultat:
http://insina.com
... si vous avez des question ou des suggestions ... il y a sûrement moyen d’améliorer cette procédure (à propos quelles sont les prochaines évolutions prévues de modx pour le multi-linguisme ?)