Newsgroup: it.comp.www.php
Titolo: PHP localizzazione e TMX

Sto implementando in via sperimentale la localizzazione di
un'applicazione web PHP con il bridge class TMX
http://tmxphpbridge.sourceforge.net
 implementato dalla Tecnick.
I vantaggi che ho percepito rispetto al modulo gettext sono:
- portabilità: le traduzioni sono contenute in un unico file XML di
facile interscambio e trasportabile su piattaforme anche diverse da PHP
(es. java) su cui si abbia un'implementazione del package di supporto al
formato standard TMX
- leggibilità e usabilità: un unico file XML delle traduzioni è molto
più comodo che avere file diversi in un formato non human-readable come
quelli di gettext, sparsi un po' ovunque nel filesystem nelle varie
directory LOCALE_XX
- facilità di installazione / manutenzione: il bridge class TMX è un
file PHP semplice da includere una sola volta; richiede semplicemente il
file XML delle traduzioni e genera file accessori PHP di "cache"
contenenti array chiave - traduzione per ogni lingua gestita
Gli svantaggi che ho percepito sono :
- serializzazione delle traduzioni: avendo un unico file XML per le
traduzioni contenente tutte le lingue costringe di fatto, qualora sia
necessario, ad effettuare serialmente le traduzioni in ciascuna lingua.
In caso contrario sarebbe necessario una notevole attività di "merge"
dei diversi file
- meccanismo di loading delle traduzioni: ad ogni chiamata il package
instanzia un oggetto di tipo TMX che controlla la presenza della cache
includendo il file PHP o rigenerandolo daccapo; qualora il file di cache
non sia presente tenta di crearlo e salvarlo nel filesystem
- creazione nuove traduzioni: ad modifica del file XML si richiede un
refhresh della cache cancellando il file PHP e ricreandolo come
descritto al punto precedente
- nei siti comuni gestiti in hosting il web server non ha la possibilità
di scrivere file nelle directory del sito per cui i due punti precedenti
non sono applicabili e richiedono prima un refresh in "locale" con
conseguente upload della cache sul sito di produzione (poco male...)
Ora, la mia idea per rendere più efficiente l'utilizzo del package è:
- catturare la lingua dell'utente
- "cachare" in sessione le traduzioni
- eventualmente "databesizzare" le traduzioni invece che usare la cache
in un file PHP incluso
Al momento ho effettuato un sistema di memorizzazione dell'array chiave
traduzione nella lingua dell'utente in una $_SESSION['translations'] e
ho implementato una funzione di getTranslation(chiave). Non so se è
l'idea migliore e la via database al posto dei file PHP non l'ho ancora
provata.
Qualcuno ha avuto esperienze a riguardo e ha suggerimenti da dare ?
thx
saluti,
M.

 traduzioni invece che usare la cache in un file PHP incluso
Non farlo.
Metterli in sessione significa che per ogni utente che visita il tuo sito 
hai un file con dentro tutte le traduzioni. Meglio lasciare la cache su 
file php incluso.
Metterli nel DB significa centinaia o migliaia di query in piu`.
Forse la cosa migliore sarebbe proprio generare un file .mo, metterlo 
nella cartella che vuoi tu (invece che sparso per il disco) e accederci 
con gettext. Oppure usare direttamente gettext. ;)
Questo perche` i file mo sono indicizzati. E` quasi come lavorare con un 
hash table con tempi di seek bassissimi.
Bye.

 hash table con tempi di seek bassissimi.
Beh, accedere ad un array key=>valore in memoria è ancora più veloce.
TMH fa l'include di un file PHP semplicissimo che contiene, ad esempio
$tmx['hello']="ciao";
$tmx['world']="mondo";
Ora, se io una volta che ho intercettato la lingua dell'utente metto in
sessione la $tmx e lo faccio solo una volta, a livello di uso della
memoria che cosa cambia ?
Quando carico una pagina avrei comunque in memoria la $tmx, soltanto che
senza la sessione me la carico ogni volta. Cosa che volevo evitare.
Nella documentazione c'è scritto che TMX ha fra i difetti il dispendio
di memoria (si vede a occhi nudo), ma tutto dipende da quante cose devo
tradurre e soprattutto quanti accessi ho. Tutte cose che posso conoscere
a priori.
Se quello della memoria è un problema, potenzialmente TMX mi mette a
disposizione la possibilità di usare un file XML di traduzioni diverso
ogni volta che voglio (ad ogni script PHP). Quindi potrei "spezzare" le
traduzioni e non averle tutte in memoria (mi pare che sia possibile
qualcosa del genere anche con gettext).
saluti,
M.

 a priori.
Non ho mai usato TMX, ma se mette TUTTE le lingue in un unico file, posso 
capire benissimo il dispendio: carichi il cinese anche se hai solo 
visitatori italiani... :)
 
Bye.

 visitatori italiani... :)
No no, ok. Non è così esoso TMX :-) Le lingue sono tutte nello stesso
file XML ma lui crea i vari cache_xx.php cache_xy.php per ogni lingua e
tu carichi solo la lingua o le lingue che ti interessano; di solito,
ovviamente, una sola (quella dell'utente).
grazie del proficuo dibattito
saludos,
M.

 la cache, e le fai generare un file .mo invece che un .php.
[...]
Sono ritornato sull'argomento.
Da PHP è sicuramente possibile generare un file .po (è un file di
testo...) ma il .mo (il compilato) come si fa ?
saludos,
M.

 testo...) ma il .mo (il compilato) come si fa ?
Devi richiamare il compilatore da system() e soci, temo.
Bye.