sito bilingue

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: sito bilingue

Messaggio da conraid »

beh, puoi usare <b> anche se non formalmente corretto. Però sì, se il traduttore è a zero di html diventa un problema

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

Io, come dicevo, non uso gettext e sbaglio. Ma la ragione è che mi sono realizzato un sistemino che funziona bene e non mi sono mai messo ad approfondire altri metodi.

Il mio sistema l'ho integrato nella classe che uso per i siti, ma ora l'ho estrapolato in forma strutturata. In pratica è un sistema plurilingue: avendo la competenza linguistica ed un po' di tempo a disposizione, si possono mettere quante lingue si vogliono.

Funziona così: c'è una directory con le bandierine, che devono essere tutte dello stesso tipo e dello stesso formato e devono essere nominate con la sigla della lingua (ad esempio it.png, en.png etc.); un semplicissimo script va a controllare le bandierine che ci sono nella directory e forma un'array delle lingue disponibili; quando l'utente sceglie la lingua, cliccando sulla bandierina, viene settato un cookie con la scelta; per la visualizzazione dei testi, ricorro ad un file esterno in cui sono memorizzate tutte le traduzioni in forma di array; in ogni array, i testi sono posizionati in ordine alfabetico per sigla (ad esempio, se le lingue sono solo "en" e "it", metto prima il testo inglese e poi quello italiano). Per aggiungere lingue, basta semplicemente aggiungere la relativa bandierina (ad esempio de.png) nella directory e i corrispondenti testi negli array del file esterno (ricordando l'ordine alfabetico, per cui, nell'esempio dato, i testi in tedesco andrebbero per primi...). Sembra complicato, ma nei fatti non lo è.

Ma ecco gli script:
index.php

Codice: Seleziona tutto

<?php
if(isset($_GET["l"])) {
	$l2set=$_GET["l"];
	setcookie("linguascelta",$l2set,time()+31536000);
	header("Location: index.php");
} 
elseif(isset($_COOKIE["linguascelta"])) $lingua=$_COOKIE["linguascelta"];
else $lingua="it";
/* Ho verificato se è stata scelta la lingua nella querystring ($_GET["l"]) e, nel caso, 
memorizzo un cookie con la scelta per una durata di un anno, tornando poi con l'header alla pagina
per leggere il cookie impostato; altrimenti verifico se esiste già un cookie con la lingua e, nel 
caso, lo importo nella variabile $lingua; come default, infine, setto la lingua ad "it". */
$linguedisponibili=array();
foreach(scandir("flags") as $flag) {
	list($sigla,$ext)=explode(".",$flag);
	if($ext=="png") {
		$linguedisponibili[]=$sigla;
	}
}
/* Ho inizializzato un array vuoto per le lingue disponibili; poi sono andato a leggere la directory
dove ho messo le bandierine, ho estratto dal nome di ogni bandierina le prime due lettere, che costituiscono
la sigla della lingua ed ho popolato l'array in ordine alfabetico. */
$indicelingua=array_search($lingua,$linguedisponibili); // Verifico la chiave della lingua scelta nell'array.
include("lingue.php"); // includo la libreria con gli array multilingue
/* Poi, nel corpo della pagina, visualizzo le singole voci in questa forma: echo $NOMECAMPO[$indicelingua] */
?>
<html>
<head>
	<title><?php echo $titolohead[$indicelingua] ?></title>
</head>
<body>
<h1><?php echo $titolohome[$indicelingua] ?></h1>
<ul>
<?php
foreach($linguedisponibili as $flaglingua) echo "
	<li><a href=\"index.php?l=$flaglingua\"><img src=\"flags/$flaglingua.png\" alt=\"$flaglingua\" /></a></li>";
	echo "\n";
// Per ogni lingua visualizzo la bandiera con il link per la scelta.
?>
</ul>
<p><?php echo $hello[$indicelingua] ?></p>
</body>
</html>
lingue.php (la libreria con le traduzioni)

Codice: Seleziona tutto

<?php
/* Per ogni chiamata, preparo un array con le traduzioni in tutte le lingue che intendo
rendere disponibili, in ordine alfabetico per sigla (ad es. "de" "en" "es" "it"...); in questo
caso abbiamo solo due lingue: "en" e "it".*/

$titolohead=array("Multilingual Site","Sito Multilingue");
$titolohome=array("This is the homepage of my multilingual site","Questa &egrave; la home del mio sito multilingue");
$hello=array("Hello world","Ciao mondo");

// etc. etc.
?>
Gli script sono funzionanti. Per provarli subito, metto in allegato anche la directory con le bandierine.

Non sarà il massimo ma funziona.

EDIT - Ah, per quanto riguarda la scelta del cookie piuttosto che della session, l'avevo spiegata prima la ragione: secondo me, se uno vuole visualizzare un sito in una data lingua, non credo che per lui sia piacevole ogni volta andare a scegliere la lingua... Poi..., fate vobis.
Allegati
flags.tar.gz
(4.58 KiB) Scaricato 203 volte

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

Considero una soluzione alla volta...
@ aschkenaz

Se non ho chiamate a singole stringhe di testo,
ma alcune pagine, come devo sistemare la <ul> del menu?
E po , appunto, qui ho 5-6 pagine per ogni lingua...

grazie mille
m

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

Basta rinominare le pagine in questo modo:
italiane - it.nomepagina.php, it.altronomepagina.php etc.
inglesi - en.nomepagina.php, en.altronomepagina.php etc.

Poi, dopo aver settato la variabile $lingua come prima, richiami le pagine con...

Codice: Seleziona tutto

include("$lingua.nomepagina.php"); // etc...
... invece di richiamare le singole stringhe. La sostanza non cambia.

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

All'interno di lingue.php?
Ma devo sfogliare il menu fon un foreach?

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

Beh, se intendi usare pagine intere, il file lingue.php potrebbe non servirti. Tuttalpiù potresti usarlo proprio per le voci di menu, se intendi tradurle, o per altri contenuti della index. Per il menu, sì, se intendi usare un array, fai come al solito con foreach.
Se hai un $menu=array("home","pagina1","pagina2"...), i file delle pagine li chiami it.home.php, en.home.php, it.pagina1.php etc... e poi
foreach($menu as $pagina) echo "
<a href=\"$lingua.$pagina.php\">$pagina</a>";

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

Tipo così (che però ha errori...)

Codice: Seleziona tutto

<div id="navlist">
        <ul>
<?php
isset($_REQUEST["pagina"]) ? $lingua.$pagina=$_REQUEST["pagina"] : $lingua.$pagina="home";

$menu=array(
    "home"=>"",
    "camera"=>"Sistemazione",
    "prezzi"=>"Prezzi",
    "dovesiamo" =>"Dove siamo",
    "prenotazione"=>"Prenotazione",
    "contatti"=>"Contattaci",
    "link"=>"Link utili"
);

$activemenu=0; $folder="home";

foreach($menu as $kmenu=>$vmenu) { if(array_key_exists($lingua.$pagina,$vmenu) |
    $lingua.$pagina==$kmenu) { $activemenu=$menu[$kmenu]; $folder=$kmenu; } }
    $vocimenu=array(
	"home"=>"Home",
	"dovesiamo"=>"Dove siamo",
	"prenotazione"=>"Prenotazione",
	"contatti"=>"Contatti",
	"link"=>"Link utili"
    );
foreach($vocimenu as $voce=>$vocevisualizzata) { echo '<li>';
if($lingua.$pagina!=$voce) { echo $voce=="home" ? '<a href=".">' : '<a
    href="index.php?pagina='.$voce.'">'; } echo $vocevisualizzata;
if($lingua.$pagina!=$voce) echo "</a>"; echo "</li>"; } echo "\n";
?>
        </ul>

</div><!--navlist-->
O mi sono complicato la vita per nulla?

Naturalmente, anche il menu deve risultare bilingue...
m

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

Ho paura che ci sia un po' di confusione in quel codice.
Ora vado un po' di fretta e ti dico quello che salta agli occhi. Poi me lo guardo per bene a casa.

Innanzitutto, all'inizio assegna semplicemente il nome della pagina corrente, come facevi di solito, ovvero senza $lingua ($lingua mettilo quando includi la pagina). Poi, visto che il menu deve assegnare anche il titolo della pagina, devi creare un menu diverso per ogni lingua, così:

Codice: Seleziona tutto

$menu.it=array(...);
$menu.en=array(...);
etc.
E infine, richiami il menu così:

Codice: Seleziona tutto

foreach($menu.$lingua as $kmenu=>$vmenu) {...}
E visualizzi le voci del menu così come facevi di solito.

Poi, al momento di includere la pagina,...

Codice: Seleziona tutto

include("$lingua.$pagina.php");

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

Il codice non è "un po'", ma molto confuso...
Fra l'altro, il primo foreach non dovrebbe includere anch'esso entrambe le lingue?

Codice: Seleziona tutto

<?php

if(isset($_GET["l"])) {
   $l2set=$_GET["l"];
   setcookie("linguascelta",$l2set,time()+31536000);
   header("Location: index.php");
}
elseif(isset($_COOKIE["linguascelta"])) $lingua=$_COOKIE["linguascelta"];
else $lingua="it";

$linguedisponibili=array();
foreach(scandir("flags") as $flag) {
   list($sigla,$ext)=explode(".",$flag);
   if($ext=="png") {
      $linguedisponibili[]=$sigla;
   }
}

$indicelingua=array_search($lingua,$linguedisponibili);

// includo la libreria con gli array multilingue
// include("lingue.php");
?>

<div id="navlist">
        <ul>
<?php
isset($_REQUEST["pagina"]) ? $pagina=$_REQUEST["pagina"] : $pagina="home";

$menu.$it=array(
    "home"=>"",
    "camera"=>"Sistemazione",
    "prezzi"=>"Prezzi",
    "dovesiamo" =>"Dove siamo",
    "prenotazione"=>"Prenotazione",
    "contatti"=>"Contattaci",
    "link"=>"Link utili"
);
$menu.$en=array(
    "home"=>"",
    "camera"=>"Accomodation",
    "prezzi"=>"Prices",
    "dovesiamo" =>"Where we are",
    "prenotazione"=>"Reservation",
    "contatti"=>"Contact us",
    "link"=>"Useful links"
);

$activemenu=0; $folder="home";

foreach($menu.$lingua as $kmenu=>$vmenu) { if(array_key_exists($pagina,$vmenu) |
    $pagina==$kmenu) { $activemenu=$menu[$kmenu]; $folder=$kmenu; } }
    $vocimenu=array(
	"home"=>"Home",
	"camera"=>"Sistemazione",
	"prezzi"=>"Prezzi",
	"dovesiamo" =>"Dove siamo",
	"prenotazione"=>"Prenotazione",
	"contatti"=>"Contattaci",
	"link"=>"Link utili"
    );
foreach($vocimenu as $voce=>$vocevisualizzata) { echo '<li>';
if($pagina!=$voce) { echo $voce=="home" ? '<a href=".">' : '<a
    href="index.php?pagina='.$voce.'">'; } echo $vocevisualizzata;
if($pagina!=$voce) echo "</a>"; echo "</li>"; } echo "\n";
?>
        </ul>
</div><!--navlist-->

<html>
<head>
   <title><?php echo $titolohead[$indicelingua] ?></title>
</head>
<body>
<h1><?php echo $titolohome[$indicelingua] ?></h1>
<ul>
<?php
foreach($linguedisponibili as $flaglingua) echo "
   <li><a href=\"index.php?l=$flaglingua\"><img src=\"flags/$flaglingua.png\"
alt=\"$flaglingua\" /></a></li>";
   echo "\n";
?>
</ul>
<p><?php echo $hello[$indicelingua] ?></p>
<div id="content">
<?php if(file_exists("$folder/$lingua.$pagina.php")) include("$folder/.$lingua.$pagina.php");
else @include("moduli/nondisp.php"); ?>
</div><!--content-->
</body>
</html>
Inoltre credo che l'include("lingue.php");
a questo punto non serva...

m

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

È $menu.it etc. non $menu.$it.
Prova, prima di tutto a fare questa correzione. Poi vediamo il resto...

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

Così mi dà errore

Codice: Seleziona tutto

Parse error: syntax error, unexpected '=' in /home/samiel/public_html/prova2/index.php on line 59
m

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

Correzioni?
Sono incagliato alla grande :-(

m

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

Il problema è che, se non ricordo male, tu avevi predisposto una struttura particolare, con sottomenu e sottodirectory per ogni pagina. Ma qui il codice mi sembra amputato di qualche parte essenziale. Dovresti postare la pagina originale, prima delle modifiche bilingue. Altrimenti non ci capisco nulla... :?

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: sito bilingue

Messaggio da samiel »

No, questa è un'altra cosa,
solo le pagine che vedi,
niente sottomenu destri e sinistri.

Aspetta... volevo utilizzare il codice tuo,
quello che hai postato. Ma in modo da caricare
pagine e non stringhe di testo

Dopo cerco di capire
anchel'altra soluzione...

m

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: sito bilingue

Messaggio da aschenaz »

E allora devi togliere quelle parti relative alle sottodirectory ed ai sottomenu. Nel codice che hai postato sopra ci sono chiamate ad array non definiti...

Rispondi