Come Gestire la localizzazione in PHP

Alessandro PC Academy di - 27 Ottobre 2016 in Programmazione

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.

Localizzazione in PHP

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=<>, per quel che concerne gli identificatori della lingua questi potranno assumere i valori

  • 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

Array

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:

Menu italiano

Selezionando il cinese, le stesse voci si menù assumeranno l’aspetto seguente

Menu cinese

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&COPY;</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 }
Share

Promozioni

Potrebbe interessarti



Alessandro PC Academy
Alessandro G.: Freelance, è programmatore, docente, collaboratore stacanovista della PC Academy. Per PC Academy cura: i contenuti dei programmi dei corsi dell'area Programmazione; le lezioni in aula della gran parte dei corsi di Programmazione; il tutoraggio di molti corsi online per l'area Programmazione e CMS; la redazione di articoli per questo portale.

Commenti