Come Gestire la localizzazione in PHP
In molte circostanze quando si realizzano dei siti sorge la necessità che questi possano adattarsi automaticamente alla lingua del visititatore, nel corso di questo breve articolo descriveremo un possibile modo per risolvere questo problema, ovviamente quando si parla di localizzazione nel nostro caso ci riferiremo alle voci principali del sito quindi le voci di menù e similiari, quindi i contenuti di “sistema” non i contenuti creati per il sito per questi si ha bisogno o di realizzare versioni differenti per le diverse lingue oppure affidarsi a sistemi di traduzione automatica, con risultati non sempre eclatanti.
Detto questo l’idea su cui ci è si è basati è quella di creare dei file ad hoc, contenenti le voci standard del sito e per ognuna di questa è stato previsto un set di voci con le rispettive traduzioni, per quel che concerne la tipologia dei file si è optato per dei file .ini, questa scelta è motivata dal fatto che php mette a disposizione una serie di funzioni apposite per il loro trattamento, di seguito riportiamo il contenuto di uno di questi file
Hello = //www.google.it
Good Morning = //www.calciomercato.com
[Categories]
Programming logic = “//www.google.it/?search”
Java Programming = “//www.oracle.com”
Programming PHP = “//www.php.net”
Various arguments = “www.wikipedia.org”
[Select Language]
Italian = it-IT
English = en-EN
French = fr-FR
Chinese = cn-CN
Entrando più nel merito i file .ini sono organizzati secondo uno schema del tipo “chiave” = “valore”, inoltre al loro interno è possibile definire delle sezioni identificabili per mezzo della dicitura [nome-sezione].
Ogni file sarà logicamente diviso in due sezioni la prima deputata a descrivere le voci dei servizi mentre nella seconda saranno elencate le lingue supportate, per il nostro esempio si sono memorizzati i file in cartelle identificate dalla lingua gestita.
Nel codice seguente si illustra come la selezione dello specifico file venga effettuato
<?php if($lang=filter_input(INPUT_GET,"lang")): // determino la lingua sulla base della selzione fatta dall'utente dal menù prsente nella gui della pagina $strings = parse_ini_file("lang/".$lang."/strings.ini", TRUE); else: $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0, 5); // recupero la lingua utilizzata dal cliente $strings = parse_ini_file("lang/".$lang."/strings.ini", TRUE); endif; if(!is_array($strings)): // uso la lingua di default $strings = parse_ini_file("lang/en-EN/strings.ini",TRUE); endif; ?>
Il primo if ha lo scopo di gestire la selezione effettuata esplicitamente dall’utente attraverso lo specifico menù, in buona sostanza a seguito della selezione l’url sarà arricchita dalla dicitura ?lang=<
- it-IT
- en-EN
- fr-FR
- cn-CN
Ossia i nomi delle cartelle all’interno dei quali ci sono i vari file di traduzione.
Tornando al codice il successivo ramo else viene invocato quando si accede alla pagina per la prima volta, in questo caso si cerca di determinare la lingua supportato dal client in particolare alla chiave HTTP_ACCEPT_LANGUAGE è associato l’elenco delle lingue supportate dalla client, i primi 5 caratteri daranno luogo ad una configurazione identica a quella con cui si sono denominate le cartelle con i file delle traduzioni. A questo punto se il primo if non riesce a produrre alcun risultato, nello specifico un array le cui chiavi coincidono con le chiavi del file ini ed i valori alle rispettive controparti all’interno di questo file, si opta per il caricamento di un set di valori di default.
La funzione che si fa carico di elaborare il contenuto dei file ini è parse_ini_file, questa con il secondo parametro settato su true consente di gestire le sezioni definite nei file, di fatto le nomi di sezioni diventano le chiavi ed i valori associati alla sezione un ulteriore sottovettore, visivamente si genera una struttura di questo tipo
Sulla base delle suddetta struttura la funzione seguente costruirà il menù apposito da inserire all’interno della nostra pagina
<?php function build_dropdown($value,$index){ ?> <ul id="dropdown<?=$index?>" class="dropdown-content"> <?php foreach ($value as $menu_item=>$value) { if( preg_match("/[a-z]{2}\-[A-Z]{2}/", $value)): echo "<li><a href='?lang=$value'>".$menu_item."</a></li>"; else: echo "<li><a href='$value'>".$menu_item."</a></li>"; endif; } ?> </ul> <?php }
in buona sostanza si verifica se ad ogni iterazione il valore identifichi o meno una lingua per mezzo dell’espressione regolare [a-z]{2}-[A-Z]{2}, la quale è verificata dagli identificativi delle lingue definiti in conformità agli standard ISO, quindi se l’espressione è verificata allora si creerà la voce che consentirà la gestione della localizzazione in caso contrario si creerà una normale voce di menù.
Il risultato complessivo sarà quindi il seguente:
Selezionando il cinese, le stesse voci si menù assumeranno l’aspetto seguente
E similmente per le altre lingue; di seguito si riporta il codice completo utilizzato per la realizzazione di questo articolo.
<?php if($lang=filter_input(INPUT_GET,"lang")): // determino la lingua sulla base della selzione fatta dall'utente dal menù prsente nella gui della pagina $strings = parse_ini_file("lang/".$lang."/strings.ini", TRUE); else: $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0, 5); // recupero la lingua utilizzata dal cliente $strings = parse_ini_file("lang/".$lang."/strings.ini", TRUE); endif; if(!is_array($strings)): // uso la lingua di default $strings = parse_ini_file("lang/en-EN/strings.ini",TRUE); endif; ?> <!DOCTYPE html> <!-- To change this license header, choose License Headers in Project Properties. To change this template file, choose Tools | Templates and open the template in the editor. --> <html> <head> <meta charset="UTF-8"> <!-- Compiled and minified CSS --> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/materialize/0.97.7/css/materialize.min.css"> <link href="//fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <!-- Compiled and minified JavaScript --> <script src="//cdnjs.cloudflare.com/ajax/libs/materialize/0.97.7/js/materialize.min.js"></script> <title></title> <style> .dropdown-button { word-wrap: normal; padding-right:3em; } li:hover, .dropdown-content>li:hover { background-color: #42a5f5; color: #4a148c; } </style> </head> <body> <nav> <div class="nav-wrapper"> <a href="#!" class="brand-logo">Localizzazione in PHP©</a> <ul class="right hide-on-med-and-down"> <?php $index=0; foreach ($strings as $key =>$value): if(!is_array($value)): echo "<li><a href='$value'>$key</a></li>"; else:$index++; ?> <li><a class="dropdown-button" href="#!" data-activates="dropdown<?=$index;?>"><?=$key;?><i class="material-icons left">arrow_drop_down</i></a></li> <?php build_dropdown($value,$index); endif; endforeach; ?> </ul> </div> </nav> <h1>E' solo un esempio </h1> <script> $(document).ready(function(){ $(".dropdown-button").dropdown({ constrainwidth:false, hover:true }); }); </script> </body> </html> <?php function build_dropdown($value,$index){ ?> <ul id="dropdown<?=$index?>" class="dropdown-content"> <?php foreach ($value as $menu_item=>$value) { if( preg_match("/[a-z]{2}\-[A-Z]{2}/", $value)): echo "<li><a href='?lang=$value'>".$menu_item."</a></li>"; else: echo "<li><a href='$value'>".$menu_item."</a></li>"; endif; } ?> </ul> <?php }
Commenti