• User Attivo

    Creazione sito multilingua

    Ciao ragazzi, devo creare per un'azienda con cui lavoro un sito multilingua, adesso pensavo di prendere vari domini in base alla lingua selezionata (per dire il .it - lingua italiana, il .com - lingua inglese, ecc..) bene fin qui nulla di grave 🙂

    Adesso volevo sapere secondo voi per non appesantire troppo il caricamento delle varie pagine è meglio che inserisco in un file di testo (per dire chiamato italiano.php o inglese.php, ecc...) tutte le parole (divise da variaibli) o inserire tutto nel database e richiamare ogni qualora mi servisse una parola??


  • User Attivo

    Ho votato per la prima ma vorrei precisare una cosa: i siti multilingua è meglio salvarli in file esterni in quanto se si dovesse aggiungere una lingua basterebbe duplicare un file lingua e modificarne i contenuti.
    La precisazione sta nel fatto che le variabili di cui parli sono una tecnica imprecisa, in quanto le variabili vengono utilizzate di frequente in ogni pagina e ci sarebbe il rischio di sovrascrivere il valore di una variabile utilizzata per la lingua.
    Il metodo giusto e, comunque, consigliato è quello di utilizzare costanti, definendole nella pagina di ogni lingua e richiamandole semplicemente con il loro nome (quindi senza la $ davanti).
    Per quanto mi riguarda tendo ad aggiungere una k davanti ad ogni costante (per distinguerle a colpo d'occhio) e mettendo il primo carattere del nome della costante in maiuscolo, come ad esempio, per la costante nome:
    [PHP]
    define("kNome","Giovanni");

    //poi per richiamarla, dopo aver ovviamente incluso il file della lingua, basta fare:
    echo kNome;
    [/PHP]

    :ciaosai:


  • User

    Ottima spiegazione portapipe.. E di sicuro è una buona regola..Sono d'accordo..


  • User Attivo

    Grazie mille per la delucidazione 😉 Io avevo pensato di usare le variabili, però utilizzando il tuo modo è molto meglio 😉


  • User Attivo

    Figurati! Poi ognuno trova il suo metodo ma direi che questo è il più sicuro.
    Un metodo invece per avere, ad esempio, delle news dinamiche in ogni lingua sarebbe quello di creare una tabella per la lingua e in ogni tabella (in questo caso la tabella news) aggiungi un campo "id_lingua" dove setti l'id lingua (esempio: Aggiungi l'italiano che ha id 3, nella tabella news inserisci una news, specificando, da un menu a tendina caricato dinamicamente, la lingua).
    Così avrai un record news con:
    1 (ID news)
    3 (ID lingua)
    Oggi cominciano le elezioni! (testo_news)

    In questo modo potrai avere le stesse tabelle con gli stessi record ma con tutte le lingue che vuoi. Aggiungendo solo un campo alla tabella per la quale vuoi avere più lingue.
    Molti aggiungono una tabella per ogni lingua, altri mettono un'infinità di campi per ogni lingua in ogni tabella... così eviti ogni appesantimento.

    [PHP]
    //definisci la costante della lingua in un file che includi dappertutto, come ad esempio quello della connessione
    define("kLingua","1");

    //in ogni query basta che aggiungi una condizione
    $query=mysql_query("SELECT * FROM news WHERE id_lingua=".kLingua." ");
    [/PHP]
    In questo modo ti basterà cambiare la costante kLingua. Come?
    Il metodo sicuramente migliore è quello di settare un cookie "perenne" (diciamo con scadenza mooolto posticipata).
    [PHP]
    //se clicca sulla bandiera italiana si crea un cookie con id 3
    setcookie("lingua","3",time()+360000000000);

    //poi la costante la modifichi come segue
    define("kLingua",$_COOKIE['lingua']);
    [/PHP]
    In questo modo l'utente avrà sempre accesso alla lingua scelta (previo cancellazione dei cookie da parte dell'utente, ma li sono cavoli suoi, giusto? 😉 )


  • User Attivo

    Grazie mille, ottima spiegazione appena termino il lavoro ti invio il link 😉


  • User Attivo

    Sarà un piacere vedere l'opera finita.
    Buon lavoro!


  • User Attivo

    Ciao a tutti, ottima spiegazione. Ma se per esempio mi trovo nella pagina pinco.php e voglio cambiare la lingua cliccando sulla bandierina, richiamo una pagina che si chiama setLang.php e gli passo per GET la lingua che voglio settare quindi setLang.php?ln=en
    La pagina contiene il seguente codice:

    [PHP]<?
    if($_GET['ln']!="")
    setcookie("lingua",$_GET['ln'],time()+360000000000);
    else
    setcookie("lingua","it",time()+360000000000);
    define("kLingua",$_COOKIE['lingua']);
    ?>[/PHP]

    E' giusto?
    Come faccio a tornare alla pagina pinco.php?
    Grazie!!


  • User Attivo

    In teoria puoi anche solo creare una funzione che ti setti il cookie e poi ti faccia il refresh della pagina, così non importa in quale pagina tu sia.
    Una volta che il cookie è settato sei a posto. Importante, ma anche scontato, che il cookie che viene creato basta sovrascriverlo per avere una nuova lingua per "sempre" (metto le virgolette perché non esiste qualcosa di perenne bensì a lunga scadenza).
    [PHP]
    function lingua($lingua){
    setcookie("lingua",$lingua,time()+3600000000000);
    header("location:".$_SERVER['PHP_SELF']);
    }
    [/PHP]
    Non l'ho testata ma il concetto è semplice: ad ogni bandiera (o link lingua) si associa un onclick con valore lingua(it) nel caso dell'italiano, lingua(en) nel caso dell'inglese e via discorrendo.
    Questo it ed en saranno i nomi del file delle definizioni del sito (e se vuoi crei una seconda funzione con l'id_lingua per la parte database, come spiegato sopra).
    Quindi si avrà un
    [PHP]
    include "lingue/".$_COOKIE['lingua'].".php";
    //il risultato nel caso dell'italiano sarà: lingue/it.php
    [/PHP]
    Di conseguenza si dovranno creare due file (nel caso di due lingue) con le stesse costanti (quindi creare prima l'italiano perfettamente e POI le altre lingue) con i nomi di it,en,ru,te,sp,fr ecc...
    Io uso due lettere ma anche tre vanno bene.

    Per la soluzione che hai proposto tu, talkoman, puoi passare tramite GET la URL della pagina dalla quale invii la richiesta di cambio lingua tramite:
    setLang.php?ln=it&url=$_SERVER['PHP_SELF']
    ma è SCONSIGLIATISSSSSIIIMISSSIMO!!!! poiché se un hacker dovesse mettere l'indirizzo di una pagina che esegue funzioni dannose poi ne saresti tu il responsabile!!
    E' una delle fregature del GET.
    O lo passi tramite post creando una funzione in javascript ma a questo punto creati la funzione lingua e rimane tutto nella pagina 😉


  • User Attivo

    Ma come faccio a richiamare una funzione cliccando sulla bandierina e ri-aggiornare la pagina?
    Grazie 😉
    [URL=http://www.giorgiotave.it/forum/gt-world/101972-forum-gt-disponibile-alle-versioni-per-telefoni-cellulari.html]Postato via Mobile


  • User Attivo

    ad ogni bandiera (o link lingua) si associa un onclick con valore lingua(it) nel caso dell'italiano, lingua(en) nel caso dell'inglese e via discorrendo.
    Come dicevo basta un evento onclick sull'immagine, al quale associ il nome della funzione e tra parentesi il valore che vuoi passare (bandiera italiana: onclick="lingue(it);"> Inglese: onclick="lingue(en);">)


  • User Attivo

    Ma posso con un onClick richiamare una funzione PHP?


  • User Attivo

    Certamente


  • User Attivo

    Non mi funziona...
    Allora io ho le bandierine in un file funzioni.inc.php che includo in tutte le pagine.
    Le bandierine sono nella seguente funzione:
    [PHP]<? function testa(){?>
    <div class="testa">
    <a href="index.php"><img src="immagini/logoTop.png" alt="Home Page" class="logoTop" /></a>
    <div id="bandiere">
    <a href="#" onclick="lingue(it);"><div class="IT"></div></a>
    <a href="#" onclick="lingue(en);"><div class="EN"></div></a>
    </div>
    </div>
    <?php }[/PHP]

    E in ogni pagina richiamo la funzione testa().
    Ora la funzione lingue() dove la devo inserire? Sempre dentro il file funzioni.inc.php o addirittura dentro la funzione testa()? Se metto il redirect dentro la funzione lingue(), non mi reinderizza a funzioni.inc.php?


  • User Attivo

    ma non devi mica mettere le bandiere in una funzione!
    Devi mettere il codice del cookie dentro alla funzione e richiamarla.
    Le bandiere sono semplici link


  • User Attivo

    Io le metto dentro una funzione insieme a tutta la testata del sito perchè se cambio una cosa dovrei cambiarla in tutte le pagine. Così modifico la funzione e automaticamente si cambia in tutte le pagine....ma parliamo delle bandierine....

    E' giusto così?
    [PHP]<? function testa(){?>
    <?
    function lingua($lingua){
    setcookie("lingua",$lingua,time()+3600000000000);
    header("location:".$_SERVER['PHP_SELF']);
    }
    ?>
    <div class="testa">
    <a href="index.php"><img src="immagini/logoTop.png" alt="Home Page" class="logoTop" /></a>
    <div id="bandiere">
    <a href="#" onclick="lingua('it');"><div class="IT"></div></a>
    <a href="#" onclick="lingua('en');"><div class="EN"></div></a>
    </div>
    </div>
    <?php }?>[/PHP]


  • User Attivo

    Allora, se devi avere le bandiere modificabili mettile in un file esterno e includilo.
    La funzione della lingua è una cosa a se stante. Non deve essere una sottofunzione o dipendende da qualcosa,


  • User Attivo

    Infatti è in un file a parte che includo "funzioni.inc.php"

    Così com'è?

    [PHP]<? function testa(){?>
    <div class="testa">
    <a href="index.php"><img src="immagini/logoTop.png" alt="Home Page" class="logoTop" /></a>
    <div id="bandiere">
    <a href="#" onclick="lingua('it');"><div class="IT"></div></a>
    <a href="#" onclick="lingua('en');"><div class="EN"></div></a>
    </div>
    </div>
    <?php }
    function lingua($lingua){
    setcookie("lingua",$lingua,time()+3600000000000);
    define("kLingua",$_COOKIE['lingua']);
    header("location:".$_SERVER['PHP_SELF']);
    }?>[/PHP]


  • User Attivo

    Non mi funziona 😞


  • User Attivo

    La funzione la puoi richiamare ma sempre in javascript:[PHP]
    <script type="text/javascript">

    function lingua(var1)
    {        
    <?php
    	setcookie("lingua",?>var1<?php ,time()+3600000000000); 
        define("kLingua",$_COOKIE['lingua']); 
        header("location:".$_SERVER['PHP_SELF']);  
    ?>
    }
    </script>[/PHP]
    

    Non l'ho testata ma dovrebbe funzionare. Mettila prima delle bandiere.

    Se non funziona allora crea una funzione per lingua, preimpostando la lingua e cambiando i nomi delle funzioni in italiano(), inglese() e richiamandole con l'onclick:
    [PHP]
    function italiano()
    {
    <?php
    setcookie("lingua","it" ,time()+3600000000000);
    define("kLingua",$_COOKIE['lingua']);
    header("location:".$_SERVER['PHP_SELF']);
    ?>
    }
    </script>[/PHP]