L'ultimo articolo scritto su Sir Bit risale a marzo 2014. La versione che state visitando è un archivio: le pagine sono accessibili come sempre e gli autori potrebbero rispondere ai commenti, ma non saranno inseriti dei nuovi articoli. Visita questa pagina per i dettagli.

Creare e gestire un sito multilingua (testo statico)

Mappamondo pieno di bandiere degli Stati

I siti che vogliono aprirsi all’estero devono preventivare una gestione multilingua delle pagine (1)

Vi è mai capitato di dover gestire un sito in due o più lingue? No? Allora siete stati fortunati, perché con l’apertura all’estero (e in particolare per i siti di e-commerce) sempre più siti anche di “piccola taglia” vi chiedono di affiancare alla lingua italiana almeno quella inglese.

Quando progettate un sito web, di qualsiasi tipo, dovreste già pensarlo come se fosse un multilingua: spesso, infatti, il cliente vi chiederà soltanto in seguito l’aggiunta di una seconda o terza lingua. Se non avete previsto in anticipo l’aggiunta, risolvere il problema potrebbe richiedervi di stravolgere molte delle query che estraggono dati dal database.

In questo articolo vi propongo un sistema per gestire un sito web con un numero indefinito di lingue. Non è l’unico metodo possibile e può essere perfezionato, ma dopo vari miglioramenti lo ritengo un approccio affidabile di base e che permette di agire agevolmente sui testi modificando pochi file.
Il linguaggio utilizzato è il php con database di tipo mysql, ma è possibile seguire lo stesso procedimento per qualsiasi altro linguaggio.

All’interno dello script, liberamente scaricabile, troverete il codice essenziale che mostra la gestione in multilingua di una pagina: dovrete adattarlo voi al vostro sito.
Inoltre troverete i dump delle tabelle essenziali del database.

La tabella della lingua

Prima di tutto creiamo nel database la tabella “lingue” (trovate il dump da importare chiamato “lingue.sql”, dove sono già predisposte l’italiano e l’inglese).
La tabella da importare sarà questa:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE IF NOT EXISTS `lingue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  `estensione` varchar(2) NOT NULL,
  `predefinita` tinyint(1) NOT NULL DEFAULT '0',
  `nascosto` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `lingue` (`id`, `nome`, `estensione`, `predefinita`, `nascosto`) VALUES
(1, 'Italiano', 'it', 1, 0),
(2, 'Inglese', 'en', 0, 0);

Il campo “predefinita” indica quale lingua da settare per default. Presumibilmente è l’italiano, per cui dovrete inserire il valore 1 associato all’italiano (come da esempio). Il campo “nascosto” è in più, nel senso che potrà tornarvi utile nel caso in cui decidiate per qualche motivo di sopprimere una lingua (basta impostare il relativo record a 1).

Consiglio: fate in modo che l’estensione sia sempre di due caratteri, potrebbe tornarvi utile nel caso in cui dobbiamo effettuare controlli particolari sulla lunghezza del valore get.

La scelta della lingua

Dal lato del sito, l’utente avrà un semplice link da cliccare (uno per ogni lingua). Al click, sarà passata la variabile $_GET[“lingua”] con il valore relativo alla lingua scelta. Questo valore (cioè il parametro get) si dovrà portare in ogni pagina del sito.
Nello script ho messo semplicemente due link senza nessuna grafica:

1
2
3
<a href="?lingua=it">italiano</a>
<br /><br />
<a href="?lingua=en">inglese</a>

Come recuperiamo la lingua voluta? Lo vedete nel codice seguente. Come potete notare, nel caso in cui esista il parametro $_GET[“lingua”] sarà preso quest’ultimo come simbolo per la lingua (it, en, ecc.).
Se invece il get sarà mancante (per esempio, appena si apre l’home del sito), sarà presa la lingua di default dal database.
Il valore sarà immagazzinato nella costante LANG, che per sua natura è globale e non modificabile.

1
2
3
4
5
6
7
8
9
//setto la lingua corrente
//se esiste il get, prendo quella, altrimenti la recupero dal database (prendo la lingua predefinita)
if(isset($_GET["lingua"]))
	define('LANG', $_GET["lingua"]);
else{
	$query=mysql_query("SELECT * FROM lingue WHERE predefinita=1 AND nascosto=0 LIMIT 0,1", DB);
	$row=mysql_fetch_array($query);
	define('LANG', $row['estensione']);
}

I testi statici

A questo punto abbiamo recuperato l’estensione della lingua corrente, racchiusa nella costante LANG.
Vediamo innanzitutto come sistemare un testo statico. Mettiamo, per esempio, che abbiate due testi da stampare a video; normalmente, anche in puro html, il codice sarebbe il testo stesso cioè:

1
2
3
Questa è la prima prova in italiano
<br /><br />
Questa è la seconda prova in italiano

Nel nostro caso, se l’utente sceglie la lingua inglese dovremo trasformare all’occorrenza queste due stringhe in:

1
2
3
Questa è la prima prova in inglese
<br /><br />
Questa è la seconda prova in inglese

Come fare per rendere dinamica la stampa? Il sistema migliore è di creare un file per ogni lingua e di importare il file adatto a seconda del valore di LANG.
Nello script trovate una cartella chiamata “languages”, che conterrà all’interno dei file di nome identico ma con il suffisso finale che cambia in base alla lingua (“lingua_it.php” e “lingua_en.php”).
Per importare il giusto file, subito dopo aver definito LANG andremo a includere:

1
include("languages/lingua_".LANG.".php");

All’interno di ognuno di questi file troveremo uno switch che, in base al case passato, ritornerà la stringa relativa. Il codice dovrebbe bastare a capire; comunque sotto spenderò due parole per spiegarlo nel dettaglio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
//contenuto nel file "lingua_it.php"
function lingua($identificativo){

	switch($identificativo){

		case "prova1": return "Questa è la prima prova in italiano"; break;

		case "prova2": return "Questa è la seconda prova in italiano"; break;

	}

}

//contenuto nel file "lingua_en.php"
function lingua($identificativo){

	switch($identificativo){

		case "prova1": return "Questa è la prima prova in inglese"; break;

		case "prova2": return "Questa è la seconda prova in inglese"; break;

	}

}

//stampa a video
echo lingua("prova1");

Lo stesso switch lo troviamo nei due file (“lingua_it.php” e “lingua_en.php”), ma naturalmente sarà presente solo quello del file incluso a inizio pagina, stabilito dal valore di LANG.
Questo significa che se siamo in lingua italiana, sarà estratto il valore corrispondente al case “prova1” del file “lingua_it.php”; se siamo in lingua inglese, sarà estratto quello di “lingua_en.php”.

Conclusioni

Una volta capito il concetto, il codice risulta molto semplice. Un sito strutturato in questo modo permette una modifica semplice e veloce, e soprattutto di adattare il portale a qualsiasi lingua (basta creare un’ulteriore file di lingua, es: “lingua_fr.php” per il francese, e di popolarlo con gli stessi case degli altri file di lingua).

Il mio consiglio è di mettere sotto questa forma qualsiasi tipo di testo statico nel sito: questo perché, in futuro, potreste aver bisogno di tradurlo o di modificarlo e per farlo vi basterà accedere ai file delle lingue.
Riconosco che in grandi siti potrebbe richiedere un bel po’ di tempo, per cui starà a voi valutare se è il caso di farlo a mano. In genere, comunque, è nei portali più grandi che troverete diverse lingue da gestire.

In questo articolo abbiamo visto un sistema per tradurre in multilingua solo il testo statico. Nel prossimo articolo ci occuperemo della parte dinamica, cioè di tradurre i testi estratti da database.

Copyright immagini

(1) http://amegliagiovani.blogspot.it/2010/09/giornata-europea-delle-lingue.html

Etichette
Etichette:, , ,
Ultimi Commenti
  1. Angelo
  2. Giuseppe
  3. Giuseppe
  4. Giuseppe
  5. Fabio
      • Fabio

Rispondi a Manuel Marangoni Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.