ATTENZIONE: la soluzione proposta in questo articolo è stata aggiornata e migliorata.
Leggi qui.
In questo articolo vorrei spiegare come ho implementato un semplice sistema multilingua accessibile ai motori di ricerca sul framework CakePHP.
CakePHP è un framework di sviluppo che implementa il paradigma Model View Controller (MVC) e che permette di utilizzare un sistema di url adatto ad una corretta indicizzazione nei motori di ricerca:
http://server/controller/azione/parametro/parametro/ecc/
La mia esigenza era di creare un sistema per implementare il multilingua che fosse accessibile a Goole ed ai motori di ricerca in genere.
Questa necessità di fatto escludeva la possibilità di salvare in sessione l'informazione sulla lingua in uso: l'informazione sulla lingua da utilizzare deve essere contenuta nella url:
http://server/controller/lingua/azione/parametro/parametro/ecc/
Utilizzando come identificazione della lingua l'identificativo a 2 lettere (it|gb|fr|de|...):
http://server/controller/it/azione/parametro/ecc/
La prima modifica da fare riguarda l'htaccess principale del sito (/.htaccess).
In questo file dobbiamo intercettare la richiesta di una lingua e passarla al sistema CakePHP come parametro QUERYSTRING.
Il seguente codice va inserito appena dopo l'istruzione RewriteEngine on.
############################################################################
RewriteRule ^js/(.*)$ app/webroot/js/$1 [L]
# Gestione del link all'home page di lingua
RewriteRule ^([a-z][a-z])/$ index.php?url=cms/display/lang_$1/ [QSA,L]
RewriteRule ^([a-z][a-z])$ index.php?url=cms/display/lang_$1/ [QSA,L]
# Gestione di qualsiasi url dipendente dalla lingua.
RewriteRule ^([a-z][a-z])/([^/] )/([^/] )/(.*)$ index.php?url=$2/$3/$4/lang_$1/ [QSA,L]
# Gestione di un controller senza la richiesta di un'azione specifica.
RewriteRule ^([a-z][a-z])/([^/] )/$ index.php?url=$2/index/lang_$1/ [QSA,L]
RewriteRule ^([a-z][a-z])/(.*)$ index.php?url=$2/index/lang_$1/ [QSA,L]
RewriteRule ^([a-z][a-z])/([^/] )(.*)$ index.php?url=$2$3/lang_$1/ [QSA,L]
############################################################################
La seconda modifica va fatta al file /app/config/bootstrap.php aggiungendo le seguenti righe di codice:
$qs = split('=',getEnv('QUERY_STRING'));
$qs = @$qs[1];
if ( subStr($qs,strLen($qs)-1,1) == '/' ) $qs = subStr($qs,0,strLen($qs)-1);
$qs = split('/',$qs);
$qs = $qs[count($qs)-1];
if ( subStr($qs,0,5) == 'lang_' ) {
$qs = trim(subStr($qs,5,2));
if(!defined('__RQL__'))define('__RQL__',$qs);
} unset($qs);
Questo codice va a creare una costante chiamata __RQL__ (Requested Query Language) che conterrà il codice della lingua da utilizzare (it|gb|de|fr|...).
Nel caso non sia richiesta alcuna lingua tale costante semplicemente non viene creata.
