Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913

    Traduzioni: metodo migliore

    Secondo voi quale di questi metodi è meglio per tradurre?
    • Usare un file .po
    • Usare un file .mo
    • Usare un array php

    Qual'è più veloce?
    No

  2. #2
    MessageFormatter se riesco a capire come funziona...

    http://it1.php.net/manual/en/class.messageformatter.php giuro che ci sto provando ma ho seri dubbi che sia "semplice".. e non c'è nessuno che lo usa quindi non ci sono neanche tanti articoli o aiuti in giro per il web.

    appena capisco come organizzare le cose forse riesco a risponderti
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Beh, allora fila a studiare!

    (Se ti interessa: http://devzone.zend.com/1500/interna...sage_formatter )

    Comunque da quello che ho capito (se ho capito) quella classe traduce date e altri numeri vari.

    Qualcosa del genere:
    Codice PHP:
    <?php
    $it 
    = new MessageFormatter("it_IT",
                               
    "Ho comprato {0, number, integer} chili di mele.<br>"
                               
    "Un chilo di mele costa come {1, number} chili di pere.<br>"
                               
    "Con i soldi che ho speso per comprare le mele, quanti chili di pere potrei comprare?"
                              
    );

    echo 
    $it->format(array(    12860,    1.472));

    /* Stampa:
        Ho comprato 12.860 chili di mele.
        Un chilo di mele costa come 1,472 chili di pere.<br>
        Con i soldi che ho speso per comprare le mele, quanti chili di pere potrei comprare?</br>
    */
    (Non ho provato questo codice perché non riesco a installarmi intl che contiene la classe)

    PS
    Usando xampp ho delle classi già installate in pear, tra cui questa
    http://pear.php.net/package/Translat...anslation.html
    (L'unica pecca è che prende i dati da un db, quindi potrebbe essere un po' lentina)

    Un altro PS
    http://www.html.it/articoli/gettext-...alizzazione-1/
    Questo è una buona cosa secondo te?

    Edit
    (Un messaggio scritto in 4 round )
    Sono riuscito ad usare MessageFormatter (dovevo solo abilitare intl nel php.ini).
    Effettivamente fa quello che ho scritto
    Ultima modifica di tampertools; 26-08-2014 a 17:48
    No

  4. #4
    Utente di HTML.it L'avatar di mt19
    Registrato dal
    Jul 2011
    Messaggi
    180
    Per creare una pagina multi lingua io avevo fatto una cosa di questo genere:

    1) Con uno script vedo che lingua è impostata sul browser
    2) Metto la lingua in un Cookie
    3) faccio un require di template/$leng.php
    4) creo i file di lingua così:

    $LENG['hello'] = "ciao";
    $LENG['welcome user'] ="Benvenuto utente";
    .....

    5) Al posto che mettere "ciao" nel template, metto echo $LENG['hello'];

    Non so se è il metodo migliore, ma sicuramente è funzionale e funzionante

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Grazie mt19.
    Si potrebbe fare anche una classe così:


    • langs/

      • it_IT.json
        codice:
        {
            "hello" => "hello",
            /* ... ... ... ... */
        }
      • es_ES.json
        codice:
        {
            "hello" => "hola",
            /* ... ... ... ... */
        }

    • classes/

      • Translator.class.php
        Codice PHP:
        class Translator {

            private static 
        $folder "langs";

            private 
        $translator = array();
            private 
        $lang "";

            public static function 
        setFolder($new_folder) {
                if (
        is_dir($folder)) self::$folder $new_folder;
            }
            
            public function 
        __construct ($lang) {        
                
        $info = array();
                if (!
        preg_match("/^(?<language>[a-z]{2})(_(?<locality>[A-Z]{2}))?$/"$lang$info))
                    throw new 
        Exception;
                
        $this->lang $lang;
                
        $dir dir(self::$folder);
                
        $files = array();
                while ((
        $file $dir->read()) !== false) {
                    if (!
        in_array($file, ["."".."]) && preg_match("/.*?\.json/"$file)) $files[] = $file;
                }
                
        $dir->close();
                if (
        in_array($lang ".json"$files)) {
                    
        $this->translator = (array) json_decode(file_get_contents(self::$folder "/$lang.json"));
                }
                else {
                    
        $founded false;
                    foreach (
        $files as $file) {
                        if (
        strpos($file$info["language"]) === 0) {
                            
        $this->translator = (array) json_decode(file_get_contents(self::$folder "/$file"));
                            
        $founded true;
                            break;
                        }
                    }
                    if (!
        $founded) throw new Exception;
                }
            }    

            public function 
        __get ($word) {
                if (isset(
        $this->translator[$word])) return $this->translator[$word];                return $word;
            }    

            public function 
        translateFrom ($word$from) {
                
        $from $from instanceof self $from : new self($from);
                return 
        $from->translateTo($word$this);
            }

            public function 
        translateTo ($word$to) {
                
        $to $to instanceof self $to : new self($to);                
                return 
        in_array($word$this->translator) ? $to->{array_search($word$this->translator)} : $word;
            }


    • index.php
      Codice PHP:
      require_once ("classes/Translator.class.php");
      $es = new Translator("es_ES"); // Creo il traduttore per la lingua spagnola
      echo $es->hello// Stampa "hola"
      echo "<br>";
      echo 
      $es->translateTo("hola""it_CH"); // Stampa "ciao". Non esistendo il file it_CH.json (Svizzera) la classe va a cercare il primo file che trova che sia it_**.json (L'italiano parlato in un altro stato, ad esempio it_IT) 
    Ultima modifica di tampertools; 26-08-2014 a 21:13

  6. #6
    Utente di HTML.it L'avatar di mt19
    Registrato dal
    Jul 2011
    Messaggi
    180
    Sì, mi sembra un'ottima soluzione. Occhio solo che non tutti hanno it_IT, alcuni hanno it e basta, altri IT... Fai tutti i casi per bene, altrimenti finisce per non funzionare. Ovviamente dovrai implementarlo con cookie/session, così se un utente non ha il cookie, allora carichi lo script che lo carica in automatico, ma se un utente vuole, ha la possibilità di cambiare la lingua (cambi la lingua nel cookie)

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    E' strano come per risolvere lo stesso problema riusciamo a trovare delle soluzioni davvero differenti. Per conto mio ho scelto un approccio molto diverso. Ho scelto di dissociare totalmente la parte html dalla parte php.

    Nella parte HTML metto delle costanti esempio : <title>:TITOLO_PAGINA:</title> sempre nella parte html ho un tag mio che consente di dare un valore di default ad ogni costante <mla_c name='TITOLO_PAGINA' value="Titolo della pagina" />. Ho anche la possibilità sempre tramite quel tag di caricare un file delle costanti <mla_c file="mio_file.cst" />. Che a sua volta puo' contenere un file delle costanti, etc...

    Poi per creare la pagina html definitiva ho un paio di oggetti di cui uno gestisce le costanti. Si carica la parte html. Un regexp ricava tutti i tag per le costanti eventualmente carica e processa i file delle costanti. L'oggetto rimpiazza le costanti e ripulisce il codice html togliendo i miei tag. Mi resta da fare la parte di amministrazione. Carico un file "html" un regexp ricava tutte le costanti. Do un valore ad ogni. Salvo il risultato e modifico il file "html" inserendo un tag mla_c file.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    sfogliandone la documentazione ho visto che anche il templare engine che uso ha una funzione per le traduzioni simile alla tua... solo che sfrutta la funzione nativa di PHP "gettext". quindi scrivo qualcosa tipo
    codice HTML:
    <div i18n:traslate="home">Home</div>
    e se trova la voce "home" nel file .mo che gli ho indicato la traduce...

    @mt19 Se come codice di lingua c'è solo it dovrebbe funzionare, e non sapevo che ci potesse essere anche solo il codice dello stato...
    No

  9. #9
    Quote Originariamente inviata da tampertools Visualizza il messaggio
    Effettivamente fa quello che ho scritto
    si ma se io voglio altre lingue, devo scrivere le traduzioni da qualche parte.. e ogni volta usare il formatter corretto

    prova a mettere anche la lingua inglese sul tuo esempio e poi anche la francese.. vien fuori un casino..
    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    Utente di HTML.it L'avatar di mt19
    Registrato dal
    Jul 2011
    Messaggi
    180
    badaze,
    molto interessante come idea, forse la migliore dal punto di vista della semplicità nella manutenzione, tuttavia penso sia anche la più difficile da realizzare (al meno la prima volta). Poi essendo ancora un noob completo in JS mi viene quasi impossibile

    tampertools,
    Interessante anche questa funzione, la approfondirò in futuro!
    Mi sembrava di si, ma forse mi sbaglio. In ogni caso basta aggiungere un caso in cui se c'è solo it/en tu per sicurezza lo rendi minuscolo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.