Newsgroup: it.comp.www.php
Titolo: Gettext

Mi stavo informando sulle funzioni gettext per fare un sito multilingua: 
  a quanto ho capito è il metodo migliore.
Prima di approfondire il tutto vorrei però sapere alcune cose, tipo:
nei file .po ho il numero di riga nella quale stampo i miei valori; se 
aggiungo righe dovrò poi rifare il file .po?
Ho letto che con Poedit fa tutto lui premendo update, ma una volta che 
il sito è online come faccio ad aggiungere/togliere roba?
Inoltre: poedit è sempre necessario o una volta che ho fatto un file .po 
(e relativo .mo) posso modificarli come se fossero txt?
Grazie

 (e relativo .mo) posso modificarli come se fossero txt?
no il po non lo tocchi, modifichi invece il mo e poi compili per avere
il po. Poedit non serve, è solo un tool per gestire meglio il tutto.
d

 il po. Poedit non serve, è solo un tool per gestire meglio il tutto.
Capito..però per compilare devo avere accesso da riga di comando al 
server oppure farlo in locale, giusto? Una volta che ho tutto online 
come faccio poi?


ah si si chiaro, puoi compilare dove vuoi, sul server serve soltanto
il .po
d

 il .po
Il .mo no? Comunque non è il massimo, o non ho capito qualcosa io...
Se uno deve fare una modifica a un file .php si deve scaricare tutto il 
sito via ftp e compilare il nuovo .po?

 sito via ftp e compilare il nuovo .po?
allora, tu hai un .mo con dentro tutte le stringhe no? Al php, se usi
gettext, serve soltanto il .po compilato. Se devi fare una modifica
compili *solo* il file .mo, il quale ti restituirà un file .po
Non vedo perchè dovresti scaricare tutto il sito. Le stringhe le metti
dentro al file .mo e basta.
d


Guarda che stai facendo casino!
Il file *.po è il sorgente - quello volendo facilmente editabile
il file *.mo è il file compilato - quello binario quello che difficilmente
gli metti mano dentro... ed è quello a cui è interessato PHP
forse hai semplicemente invertito i nomi :)

 forse hai semplicemente invertito i nomi :)
ah pardon, hai ragione, ho semplicemente invertito il .mo con il .po
comunque la sostanza non cambia.
d

 
Ok, quindi io posso modificare il solo .po e far compilare a poedit per 
ottenere il .mo da mettere online giusto?
Ma se il mio file php cambia? Ho visto che è segnato il numero di riga 
per ogni stringa, se cambia quello devo necessariamente scaricarmi i 
sorgenti php che ho modificato e aggiornare il .po? O volendo posso fare 
tutto a mano ma è bella lunga come cosa.... sbaglio qualcosa qui?

 tutto a mano ma è bella lunga come cosa.... sbaglio qualcosa qui?
Non so come hai creato i po, ma generalmente il po contiene la stringa 
originale (come e` nei _("stringa"); nel codice PHP) e tu la traduci 
generando il mo.
Non vengono mai usati i numeri di riga.
Devi modificare (ricreare) il po quando cambi la stringa (o ne aggiungi di 
nuove), perche` lui la usa come indice per la traduzione.
Bye.

 nuove), perche` lui la usa come indice per la traduzione.
quindi, io ho una cosa del genere (è un pezzo, manca tutta la parte sopra):
#: prova.php:9
msgid "Hello World"
msgstr "Ciao Mondo"
ho quel :9, l'ho visto usare da tutti e l'ho messo, non serve quindi?
volendo aggiungere un'altra stringa basterebbe aggiungere
#: prova.php
msgid "prova"
msgstr "provaprovaCiao Mondo"
compilo e sono a posto?

 ho quel :9, l'ho visto usare da tutti e l'ho messo, non serve quindi?
No. E` un commento. Non serve nemmeno il resto della riga. Serve solo a te 
per capire dove viene usata quella stringa.
Bastano msgid e msgstr.
Tra l'altro puoi usare la stessa stringa in altri file e non devi 
ritradurla. La traduci una volta sola.
Bye.

 Bastano msgid e msgstr.
Tutto ciò è fantastico. Grazie mille, proverò a utilizzarlo!

 Tutto ciň č fantastico. Grazie mille, proverň a utilizzarlo!
Mi sembra che dimentichiate la cosa piu' importante del sistema gettext: il 
comando xgettext.
Il comando xgettext legge il tuo file sorgente, per esempio in php, e ti 
crea automaticamente il file con le stringhe da tradurre. Apri quel file con 
poedit ed il gioco e' fatto.
E quando modifichi alcuni dei tuoi files sorgente? Allora devi usare 
"xgettext -j". Con quest' opzione puoi aggiungere al tuo file .po solo le 
stringhe che hai aggiunto o modificato dall'ultima volta. Quando apri il 
nuovo file con poedit, ti troverai che le stringhe che hai tradotto in 
precedenza sono gia' tradotte, e devi solo aggiungere la traduzione di 
quelle nuove.
http://gd.tuwien.ac.at/linuxcommand.org/man_pages/xgettext1.html
Nella root della mia applicazione io tengo un file batch siffatto (in debug, 
non in produzione, naturalmente per sicurezza):
xgettext -j -C -f gtlist.txt -o inc\locale\en\LC_MESSAGES\myapp.po
xgettext -j -C -f gtlist.txt -o inc\locale\es\LC_MESSAGES\myapp.po
xgettext -j -C -f gtlist.txt -o inc\locale\fr\LC_MESSAGES\myapp.po
Dove gtlist.txt e' un file di testo contenente la lista di tutti i miei 
files .php.
Gettext e' una potenza, basta capire come funziona. 

 comando xgettext.
<snip>
ah che figata, immaginavo di conoscere solo l'1% di tutto l'ambaradà.
Grazie per la spiegazione.
d

 comando xgettext.
Ma per questo ho bisogno di avere accesso completo al server, mentre per 
chi usa un hosting condiviso si devono per forza riscaricare i .php e 
creare il po da li giusto?


Ma scusa perchè dici "riscaricare", quando fai l'upload dei file la
copia in locale ti rimane, usa quella allora. Sei poi usi svn ancora
meno problemi.
d

 meno problemi.
Perchè spesso mi trovo a fare delle piccole modifiche a dei file che 
sono online...svn non lo posso usare su hosting condivisi

 online...svn non lo posso usare su hosting condivisi
Dammi retta, dopo le "piccole modifiche" riscarica sempre i files.

 
Cosa intendi dire? Per gettext o in generale?



In generale.. si chiama.. backup ( e non bastano mai)
-- 
Stefano Aglietti - StallonIt on IRCnet - ICQ#: 2078431
Email: 
st...@40annibuttati.it
 
ste...@people.it
Sites: 
http://www.40annibuttati.it
 (personal blog)
 
http://www.wordpress-it.it
 (WordPress Italia)

  a quanto ho capito è il metodo migliore.
Un'ultima questione: secondo voi è bene usarlo anche per i testi su db o 
per quello è meglio distinguerli già su db con id_lingua = 1 o 2?
Chiedo perchè il lavoro da fare mi sembra più o meno uguale (traduco o 
su db o sul file .po), come anche il codice da scrivere (basta un where 
id_lingua = x in più). Come prestazioni e in generale come mantenibilità 
  sulla lunga distanza cosa mi consigliate di fare?

 Non usare alcun db per le stringhe :)
Beh, aspè, ci sono cose per cui non posso non usare le stringhe...
Altrimenti non avrei nemmeno bisogno del db...devo estrarre (e in caso 
tradurre) alcuni nomi di prodotti di catalogo, mi serve per forza un db...



Non usare alcun db per le stringhe :)
Mettile nel codice, usa xgettext, e traduci i .po. Molto più manutenibile --
una cosa su tutte: per i .po esistono una miriade di GUI, per le stringhe sul
tuo DB dovresti andare di phpMyAdmin/phpPgAdmin/... o crearti un tool tuo. Che
poi devi mantenere ;)
My 2 cents,
David
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 per quello è meglio distinguerli già su db con id_lingua = 1 o 2?
Vedi quello che dice David.
Per i testi dinamici, invece, quelli che inserisci dal backend del sito, 
gestiscili nel DB con l'id lingua (io uso i codici internazionali "it", 
"en", "de", ecc. invece di numeri, e poi indicizzo la colonna)
Bye.

 
Ah ecco, io infatti intendevo per i testi dinamici...Anche David forse 
intendeva questo e non l'avevo capito, me ne scuso.
Ok quindi vado col db. Grazie ancora

 "en", "de", ecc. invece di numeri, e poi indicizzo la colonna)
Deduco che il quesito che ponevi un anno e mezzo fa sia stato da allora
"risolto" poi così e cioè una sola tabella in cui metti una cosa del
genere:
id_msg | id_lan | title | msq | date_time
-----------------------------------------
  n    |   it   | ....  | ... | ....
con le prime 2 colonne indicizzate e rese chiave primarie

 con le prime 2 colonne indicizzate e rese chiave primarie
Esatto.
Anche se, a dire il vero, non mi sono capitati molti siti multilingua, da 
allora. In generale uso questo sistema, per casi particolari mi sono 
riservato di usare anche gli altri (quello di "una tabella per lingua", 
per esempio).
Bye.