Multilingua in CakePHP

Marco Pegoraro, 17 Luglio 2007

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.

Categorie: CakePHP;


Aggiungi il Tuo Commento:

Inviando questa risposta dichiaro di aver letto ed approvato le condizioni di utilizzo di questo sito web.

(*) = campo obbligatorio.


Condizioni di Utilizzo:

1 - Tutte le risposte inviate a questo sito saranno sottoposte a moderazione manuale da parte dell'amministratore al fine di evitare il fenomeno detto "SPAM".

2 - Tutti i dati inseriti nel modulo di risposta verranno pubblicati in questa pagina ad eccezione dell'e-mail. Tale informazione viene richiesta ed archiviata dagli amministratori al fine di scoraggiare un utilizzo non consono del blog.

3 - Non utilizzare le risposte per pubblicizzare il tuo sito web. Tale tentativo verrà cancellato dall'amministratore. In ogni caso ai link inseriti nelle risposte viene applicato il "nofollow" per cui non ti portano vantaggi.
Se vuoi possiamo discutere uno scambio link: Srivimi!