Newsgroup: it.lavoro.professioni.webmaster
Titolo: Realizzare un portale in più lingue.

In passato e tutt'ora ho realizzato dei portali ai quali si può accedere in
più lingue, tramite le classiche bandierine da cliccare magari nel top del
layout.
Fino ad ora, mi ero ritrovato a lavorare su dei portali dove c'erano un tot
di parole, testi, frasi in home page o cmq in tutto il sito che potevano
essere settate dalla relativa amministrazione, ma questo "tot" era sempre
stato diciamo un numero contenuto.
Inoltre non ne ho fatti centinaia, sarò al sesto settimo, non lo so,
effettivamente ho anche perso il conto. Ma non un numero enorme di portali
che devono comprendere l'uso di più lingue e ho fatto riferimento sempre
allo stesso metodo che ho sempre la sensazione che non sia il migliore.
Finchè il tot di parole da settare da amministrazione tramite database era
limitato, nessun grosso problema in genere con questo metodo che uso di
solito, ma in questi giorni sto facendo un portale dove i testi che si
possono creare da database in più lingue, per l'esattezza sono 5 (le
lingue), sono veramente tanti, ma tanti e il metodo che utilizzo io di
solito mi sta creando dei problemi di tempo, in quanto sono stato tipo
un'ora buona a fare dei copia incolla fra due o tre pagine php e database
per sistemare solo i testi dell'home page e devo fare tipo altrei 4 pagine
buone così, ciò vuol dire che un giorno buono se non di più ce lo passo a
fare tutte queste operazioni ripetitive.
Allora stavo pensando prima di tutto nuovamente se potevo trovare un altro
metodo o altrimenti se potevo trovare il modo di automatizzare in qualche
modo il mio tipo tramite un programmino magari proprio scritto in php.
L'importante è non stare delle ore a fare dei copia incolla.
Quindi...
Voi, se siete già stati alle prese con una cosa del genere, che metodo usate
di solito?
Secondo voi esiste un modo per automatizzare il tutto, facendo si che quando
si rifà un portale simile si possa utilizzare la stessa procedura automatica
senza perdere ore che si potrebbero impiegare in qualcosa di più difficile
di tanti copia e incolla?
Se volete analizzare il mio metodo, che ripeto, secondo me fa un po' schifo,
ma fino ad ora non ho mai avuto necessità di migliorarlo allora ve lo
descriverò.
Ditemi un po' le vostre osservazioni su questo problema e scusate se mi sono
espresso piuttosto male.
Ciao!

 mi sono espresso piuttosto male.
da quello che dici non si capisce nulla...
in ogni caso il metodo che usi è sicuramente sbagliato... perche' comporta
lavoro lato webdeveloper... il che per definizione è un errore. Le lingue
sono qualcosa lato content, quindi sono cose che devono gestire i copy.
Detto questo quello che ti serve è un dizionario interno che ti gestisca N
lingue. Quindi la stessa pagina è visualizzabile in tutte le lingue
definite, solo perche' chi si occupa del content... le ha inserite...
-- 
Lino Mari [mod - it.economia.e-commerce]
http://www.ebow.it
 - e-business on web!
http://www.ebow.it/blog/
 - Mktg Log
http://www.dev2dev.it
 - La rete ha connesso nuove particelle - d2D004


Nel mio caso ci deve essere per forza un lavoro di sviluppo.
Allora, prendi un sito, un portale qualsiasi, tipo anche 
ebow.it
 e immagina
che ogni testo presente sulla pagina che stai vedendo sia preso da database.
Immagina che questo portale l'hai venduto a un tuo cliente e che tutti i
testi se li sia messi lui dall'amministrazione tramite alcuni form.
Ogni testo, per qualsiasi cosa, o quasi, può essere inserito e cambiato
dall'amministrazione.
Quindi, io di solito, creo dei moduli dall'amministrazione, dei form, dove
per ogni frase, parola che sia, ho un campo di input.
Quindi (scusa la ripetizione :p) devi creare la pagina con il modulo secondo
la grafica stabilita, per ogni campo assegnare il nome giusto e il valore
giusto da riprendere dal database quando mofichi cioè sempre e poi definire
la query che modifica nel database i testi.
Inoltre nel mio caso, poi magari se approfondiamo il discorso spiego ancora
di più e meglio, che ho una funzione che mi riprende le parole, frasi
necessarie per la relativa pagina nella lingua richiesta le rende globali e
vengono stampate dove devono essere stampate nel codice html.
Tutto questo mi crea una notevole perdita di tempo come detto prima.
Ovviamente stabilito un procedimento standard questo potrebbe essere fatto
da altri al posto mio sicuramente in quanto stabilite le regole su cui agire
è solo una serie di copia e incolla alla fine.
Però il mio metodo può non essere buono e con tante parole il problema di
tempo diventa enorme.
Ora stavo pensando che: in un sistema come phpnuke, se non erro, perchè è
molto che non lo uso e potrei aver dimenticato, c'è un sistema per cambiare
la lingua, mantiene le espressioni in dei file.
Questo metodo era già stato usato da un altro programmatore per un altro
portale che poi ho dovuto curare io.
Però non è il mio caso.
Lì tutte le espressioni sono contenute in dei file stile phpnuke.
Le mie sono contenute in un database.
Ora non è il problema di file o database il problema è che l'utente, il
cliente, quello che vuoi tu deve avere l'opportunità tramite
un'amministrazione di cambiare tutte queste espressioni in ogni lingua
secondo suo piacimento.
Insomma come se nel phpnuke si personalizzasse tutte le scritte standard che
vengono a video e che sono memorizzate in dei files.
E... può darsi anche che mi sbagli ma non mi sembra proprio si possa fare.
Se mi sbaglio mi farà pure piacere perchè trovo metodi migliori.
Non so se stavolta mi sono espresso in modo migliore o il problema sarà più
chiaro.
Ma sono sicuro che a forza di parlarne a un punto ci arriviamo.
Nell'eventualità di fare altri lavori del genere io vorrei trovare il modo
di costruire un software, un qualcosa nel quale io sgli scrivo i nomi dei
campi, il numero delle lingue e lui mi genera da solo form, query, funzione
per prendere le espressioni e stampare.
In questo modo di sicuro ci metterei come minimo 20 volte meno in termini di
tempo, perchè compilando un modulo con le espressioni vi verrebbe tutto
autogenerato.
Per adesso è un sogno :p


 fare. Se mi sbaglio mi farà pure piacere perchè trovo metodi migliori.
credo che utilizzando il db... sia sicuramente meglio... devi creare delle
label predefinite per delle posizioni nelle pagine definite... in modo che
successivamente diventa solo un problema di impaginazione... e non di
sviluppo.


 sviluppo.
Scusa, se no non ci intendiamo, tu per label che intendi di preciso?


 input un suo nome in base all'espressione che dovrà modificare no?
Ma non potresti creare una tabella per ogni lingua con i campi delle colonne
uguali per tutte le tabelle e poi in amministrazione selezionare tramite una
casella di scelta multipla la lingua da modificare? In questo modo andrai ad
agire sul database dall'amministrazione passandogli oltre che le parole
anche la tabella della lingua nella quale inserire i valori.
Ciao.
Massimo.


ehm... avere una tabella UNICA per tutte le lingue in cui siano presenti
anche i riferimenti alla lingua no eh?

 ha scritto nel messaggio
news:c8q2ms$fst$1...@lacerta.tiscalinet.it...

Secondo me il metodo più elementare è crearsi una cartella in cui
memorizzare i file da destinare alle versioni linguistiche, esempio...
cartella LANG.  dentro metti:
a) italian.lang.php
b) english.lang.php
etc..
quindi per esempio:
italian.lang.php
<?php
  $username = 'nome utente:';
  ?>
english.lang.php
<?php
  $username = 'username:';
  ?>
a questo punto nel file config.php:
config.php
<?php
  $language = 'italian:';
  ?>
e cosi setti la versione  italiana, oppure english per quella inglese.... in
alternativa, questa operazione la fai fare tramite form e database :)  Ma
almeno il grosso lo mantieni sul file *.lang e la traduzione in altre lingue
è la piu immediata.
Cooper.
-- 
BlueWare Web Agency
   [web] 
http://www.blueware.it
   [icq] 146781935

 ha scritto nel messaggio
news:c8r25v$b92$1...@lacerta.tiscalinet.it...

Ci possono essere tanti modi di realizzare questo sistema.
La prima volta lo realizzai avevo poco tempo e di conseguenza non credo di
averlo fatto nel modo migliore.
Adesso mi trovo nella necessità di valutare quale sia il modo migliore e di
automatizzarlo per non dover sprecare ore.
Per adesso, qui sul newsgroup, né da altre parti ho trovato proposte
migliori.
Oggi era domenica e probabilmente molti di voi forse non hanno ancora letto
di questo mio problema.
Sicuramente sarà utile a tutti o almeno spero.
Ad ogni modo sto riformulando la mia soluzione come vi illustrerò adesso.
In realtà ci ho appena pensato, nemmeno una mezzora.
Siccome ho più pagine che contengono più parole o frasi o testi editabili in
n lingue, considerato che una stessa parola potrebbe essere presente in più
pagine con valori diversi, ho bisogno che ogni parola abbia un riferimento
alla pagina.
Supponendo, e nell'ultimo lavoro ce l'ho, una tabella delle pagine, ogni
pagina ha un suo id e tale id sarà contenuto anche in una tabella che
conterrà tutte le parole di tutte le pagine.
Il principio di creare una colonna in una tabella per ogni parola di ogni
lingua pensavo fosse sbagliato subito dall'inizio, ma non avevo molto tempo
per mettermi a meditarci sopra e nonostante tutto funzionava e funziona
tutt'ora come metodo per quanto contorto possa essere.
Una tabella dove ogni riga rappresenta una parola in una lingua credo sia la
cosa migliore che mi viene in mente adesso.
Le colonne sarebbero id della parola, nome della parola, valore della parola
(espressione, chiamiamola come ci pare), id della pagina dove sarà contenuta
la parola.
Penso che farò un programma php al quale invierò le parole con i loro nomi e
le pagine a cui faranno riferimento tramite un modulo.
Sceglierò prima di tutto il numero delle lingue e l'id della pagina, poi il
numero delle parole e mi genererà automaticamente i campi per i nomi delle
parole. Il programma poi genererà da solo la query che costruirà o
modificherà la tabella nel database, la query di modifica e il form che la
eseguirà. Il form dovrà essere fatto in un modo standard, sarà poi
eventualmente chi cura la grafica e l'html a modificarlo, ma i campi saranno
già generati, andrà solo sistemato il layout, eventualmente. Genererà anche
la parte principale della funzione che riprenderà tutte le parole dal
database e le associerà stavolta a un array che le conterrà tutte, ognuna
identificata dal suo nome e contenente il suo valore.
Meglio di così per ora non mi viene in mente, ma probabilmente pensandoci
ancora viene ancora meglio.
Magari tutto questo è superfluo e ci sono soluzioni molto più brevi e
migliori che non mi vengono in mente perchè mi mancano ancora molte cose da
imparare riguardo anche i database.

Ciao,
Mi inserisco in punta di piedi in questo post...dato che non ho mai
realizzato praticamente un sistema del genere vado un pò a intuito e
un pò a logica.
Se ho ben capito hai dei blocchi di testo (frasi paragrafi o quant'
altro) che devono essere tradotti in più lingue,ora:ovviamente i testi
del sito sono memorizzati in un DB.
Mi sembra di capire che tu abbia progettato il DB in questa maniera: 1
riga per ogni blocco da tradurre e tante colonne quante sono le lingue
del sito...
E qui ti sei incasinato la vita perchè ovviamente devi creare form
amministrativi per modificare la prima, la seconda, e così via per
quante sono le lingue(è questo il copia incolla di cui
parli??).Oltretutto in questa maniera aggiungere o togliere delle
lingue comportam la modifica alla struttura del DB.
Credo che la scelta più giusta sia quella di (che poi mi sembra di
capire sia anche il metodo che usa lino..) impostare il DB in questa
maniera:
Crei due tabelle, la prima contiene un elenco dei blocchi da tradurre
(non il testo in una lingua particolare, ma solo il riferimento a
quella porzione di testo), ovviamente ognuno con il proprio id e la
chiami tblLabel.Se per esempio hai una pagina con una didascalia e una
chiusura la tabella conterrà due  record (sto inventando ovviamente):
id        label
1         didascalia
2         chiusura
Poi crei una seconda tabella (tblTraduzioni) di 4 colonne:la prima è
l'id univoco della traduzione, la seconda il riferimento all'id in
tblLabel, la terza indica la lingua (es 1 per italiano, 2 per inglese,
ecc ecc)In questo modo ottieni una tabella tipo:
id           idLabel             testo          idLingua
1            1                   Ciao Mondo     1
2            1                   Hello World    2
3            2                   Questa è mia   1
4            2                   This is mine   2
In questa maniera la struttura del database non è influenzata dal
numero di lingue del sito (possono essere 2 come 20) e di conseguenza
neanche i form di amministrazione, infatti puoi usare sempre lo stesso
cambiando solo il valore di idLingua che memorizzi(magari con una
selectbox).Ad andare ancora un passo avanti potresti farti anche una
tabella con tutte le lingue che intendi usare e collegarla alla
seconda (in questo modo eviti di lavorare direttamente con gli id e
hai un riferimento testuale collegao es:ITaliano che magari puoi usare
per far selezionare la lingua agli utenti).
L' ho buttata la un pò al volo e probabilmente la cosa si potrebbe
affinare un pò di più (sicuramente ci saranno metodi più eleganti), ma
dovrebbe funzionare e risolverti il problema di dover fare una sezione
amministrativa per ogni lingua.
In questo modo il campo idLabel ti serve per posizionare i blocchi di
testo in giro per il sito e il campo idLingua per scegliere la
traduzione che ti serve.In effetti potresti anche eliminare la prima
tabella e lavorare direttamente con gli idLabel, ma la tabella
collegata potrebbe aiutarti nel realizzare l' area di aggiornamento,
quando avrai 50000 label sarà sicuramente più facile gestirle con un
campo descrittivo collegato ad ognuna di esse che ti aiuti a ricordare
cosa rappresenta nel sito...
Spero di non essere andato completamente fuori strada e averti dato
una mano, altrimenti....pazienza, avrò perso un pò di tempo;)
Ti ripeto non ho mai affrontato praticamente la cosa, quindi prendi
questo post per quello che è...
Ciao

 costruire il form anche in html e basta.
il tuo problema è proprio nella soluzione scelta... non puoi avere n colonne
per ogni lingua... come dicevo nella prima risposta devi crearti un tuo
dizionario a cui associare una label... mi spiego con un esempio:
dizionario:
ID
ID_LINGUA (IT, UK; FR)
LABEL (chisiamo...)
TESTO (anche html)
in questo modo... crei un tuo metodo che all'interno della pagina posizione
le varie label... e vengono esplose in base alla lingua che gli passi
(ID_LINGUA) .


 CUT
Se ho capito bene il tuo problema devi usare gettext e locales, c'e' un
modulo apposito nella libreria standard di PhP.
Certo che potevi dare un'occhiata *prima*, adesso aggiungere una
localizzazione non sara' banalissimo :)
HTH,
  ngw

 del sito...
No, nel sistema originario che avevo fatto di fretta e che fino ad adesso mi
bastava c'era una tabella con una sola riga e ogni colonna rappresentava una
espressione in una data lingua, quindi 20 espressioni in 5 lingue = 100
colonne e una sola riga, magari per l'intero sito.
Adesso però 100 colonne ci sono solo per una pagina e devo fare più pagine.
L'amministrazione è tutta insieme, 20 espressioni, 100 campi input, un solo
form.
Nell'amministrazione che sto facendo adesso è compresa anche un'abilitazione
delle lingue. Se disabiliti una lingua e vai nel form per controllare le
parole delle homepage ti compare solo gli input per le lingue abilitate e
nel fron office del sito compaiono solo le bandierine relative alle lingue
abilitate.

Ho letto in fretta il tuo metodo perchè sono arrivato in ufficio adesso.
Sembra interessante ma troppo complicato ad un primo acchito.
Leggi su un altro mio post come vorrei fare in futuro.
Per il lavoro che sto facendo adesso utilizzerò ancora il vecchio metodo a
progettare gli automatismi per quello nuovo ci metterei quanto a fare quello
vecchio ed ho poco tempo purtroppo.
Cmq grazie molte del suggerimento. Penso che poi a casa lo leggerò più
accuratamente e se davvero è valido ti ringrazierò ancora.
Ciao!


Si, per il nuovo metodo che utilizzerò farò di sicuro così.
Avevo pensato anche io una cosa del genere, in più come dici giustamente, ma
ancora non sono sicuro che per come svolgo io la cosa sia la soluzione
migliore, metterò anche l'id della lingua. Dico che ancora non sono sicuro
perchè in questo momento sono un po' di fretta e non ho tempo di meditare
bene sulla cosa, ma ti ringrazio e sono sicuro che mi sei stato di grande
aiuto!


Ciao,
In effetti quello che fai č pericoloso dal punto di vista del consumo di
risorse.
Mettere tutto nel database in questi casi, non č una buona idea. Se il
portale č grande e molto visitato, potresti avere seri problemi con con il
processore del server.
Io mi regolo cosě:
I testi piccoli e le singole parole le metto tutte in un solo file di
"lingua", dove metto un array globale e dove metto anche altre variabili per
la codifica della lingua, e questo file lo includo dove mi serve. Questo
consuma un poco di memoria in piů, ma evita di fare query che possono
diventare pesanti. Questo metodo č molto semplice da gestire una volta fatto
il lavoro iniziale di sostituire le parole con i riferimenti.
Per esempio se hai una pagina con 20-30 parole o singole frasi, si devono
fare 20-30 query sul database, solo per questo, non č una buona idea mettere
piccole frasi o singole parole nel database.
Riepilogando.
Le paroli proprie del sito, e le frasi proprie del sito, quelle che non
devono essere modificate sempre le metto in un file che poi includo.
Mentre i testi piů corposi e i contenuti che vanno modificati spesso o dal
cliente, li metto nel database.
In ogni caso il copia incolla lo devi fare per forza, per togliere le parole
dalle pagine e sostituirle con il riferimento, solo che č sicuramente piů
veloce come operazione se la fai su un file di testo, piuttosto che inserire
nel database.

   ngw

 con il processore del server.
non credo... in questi casi si fa utilizzo della cache per non aprire sempre
nuove connessioni e query...


 nuove connessioni e query...
La cache può aiutare fino ad un certo punto,  la cache è una memoria
limitata. Se il portale ha migliaia di pagine diverse ci mette poco ad
andare lo stesso in crisi, cache o non cache.

 piccole frasi o singole parole nel database.
No, assolutamente no.
Io faccio una sola query e prendo tutte le parole di tutta la pagina o di
tutto il sito tutte insieme e se dopo le metti come variabili di sessione la
query l'ha fai pure una sola volta.



Ad ogni modo ho da fare altre 4 pagine con relativi form con una media di
100 campi a form e visto che oltre a farmi due bip così e che ci vuole in
media minimo un'ora e mezzo a form mi sto facendo ora un programma in php,
una primitiva versione di quella che farò poi, per generami la query che
crea il database e le funzioni per modificare e prendere le espressioni, alm
eno una buona parte di copia e incolla pallosissimi me li evito e premendo
un tasto mi genero tutto tempo 2 secondi.
Il form putroppo per adesso non lo posso automatizzare perchè è già fatto in
html layout e tutto.
Per automatizzarlo perderei un sacco di tempo.
La migliore cosa è generarne uno standard sempre con un programma in php e
poi implementarlo in futuro.

 andare lo stesso in crisi, cache o non cache.
io non parlavo di cachare le pagine... ma alcune tabelle del DB... le pagine
rimangono dinamiche... si eliminiano solo le query...


 sessione la query l'ha fai pure una sola volta.
questa e' una soluzione da non adottare... le sessioni si moltiplicano per
ogni utente... e nonmi sembra il caso... quello che serve e0 la gestioen
della cache...


 adatto con un db adatto... come MS SQL Server...
Il peggiore in assoluto.

 Il peggiore in assoluto.
ovviamente ho esperienze diverse... e se determinate affermazioni venissero
seguite anche da fatti sarebbe molto meglio...


 Il peggiore in assoluto.
eccolo li, come sempre parli dall'alto della tua grande esperienza su mssql
-- 
ITHost (your host company)
Technical Manager
C. Paparelli (MCSE,MCSD,MCDBA)
http://www.ithost.ch

 mssql
forse ha confuso my con ms :)))


 - Giovanni Ceglia :

Uno dei peggiori, totalmente inadatto ad un lavoro di questo tipo.
Oracle poi ... potrebbe essere un buon passatempo, perche' la macchina
saltera' in aria, eccome ...
Paradossalmente, se proprio si vuole usare un DBMS per la
localizzazione/internazionalizzazione (!!! esilarante anzicheno') uno
dei database piu' adatti potrebbe essere proprio MySQL, in quanto la
maggiorparte delle funzionalita' di un database serio sono perfettamente
inutili per un compito di questo tipo (nessuna atomicita', addirittura
nessun inserimento, select su select).
Al di la' di questo anche una analisi superficiale del problema rivela
quanto un database sia inadatto, e doppiamente inadatto se relazionale.
Sono semplici e banali hash, il sistema operativo supporta questa
funzionalita' e, tra l'altro, per emularla artificialmente serve un
discreto sforzo, e presumibilmente piu' interazione da parte
dell'utente, il codice e' piu' verbose e ripetitivo, e in piu' pure
lento, senza contare lo spazio disco aggiuntivo di indici e cazzi vari.
*Prima* si guarda la libreria, poi casomai si implementa.
HTH,
  ngw

 Uno dei peggiori, totalmente inadatto ad un lavoro di questo tipo.
l'errore sta nel concetto, mi spiego meglio e parlo per esperienza visto che
da noi tutto va fatto come minimo in 3 lingue :-)
Ci sono 2 soluzioni:
Se il sito è composto da x pagine e vuoi gestire 4 lingue la soluzione di
wrapper ovvero cambiare la lingua utilizzando in php setlocale in asp
session.lcid è la soluzione corretta e in termini di prestazioni utilizzare
mysql è un ottima soluzione in quanto come giustamente hai spiegato è molto
performante e per quello che deve fare ovvero un'infinità di select si trova
perfettamente a suo agio, utilizzare altri db quali oracle o mssql
effettivamente sarebbero sprecati in quanto crerebbero un inutile spreco di
risorse
Se invece il sito è più corposo allora la soluzione da fare è quella di
creare x siti 1 per ogni lingua in quanto ogni sito avrà una vita propria
con contenuti diversi


 della cache...
Mi potresti illustrare tale soluzione per favore?
Cioč la gestione della cache, con particolare riferimento a questo caso,
cioč reperire una unica volta i testi da stampare a video dal database senza
dover fare piů query e moltiplicare le sessioni per ogni utente.
Causa ignoranza, non so proprio come si faccia.


 Causa ignoranza, non so proprio come si faccia.
parlo per asp classic, ti basta utilizzare l'oggetto application e NON
l'oggetto session
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q300883&ID=kb;en-us;Q300883&SD=MSDN
-- 
ITHost (your host company)
Technical Manager
C. Paparelli (MCSE,MCSD,MCDBA)
http://www.ithost.ch
pertanto all'evento Application_OnStart esegui

 con contenuti diversi
Se i siti sono diversi i siti sono diversi, e grazie mille.
Se i siti sono uguali e il problema e' la l10n/i18n allora basta usare
una soluzione mista, in cui gettext localizza ad esempio il meno,
l'header e il footer, e il sito in generale, e gli "articoli" vengono
presi da una qualunque base di dati. Anche dei file su disco, non c'e'
alcun problema.
O farsi furbi, ed usare un sistema gia' predisposto ad avere queste
funzionalita', come Plone (questo conosco) o presumo qualsiasi CMS 
lontanamente decente.
HAND,
  ngw

 lontanamente decente.
:-)



http://support.microsoft.com/default.aspx?scid=kb;en-us;Q300883&ID=kb;en-us;Q300883&SD=MSDN
Si č vero, hai ragione, lo conosco, in php esiste una cosa simile
all'oggetto application in asp?


 all'oggetto application in asp?
Variabili globali e cookie ? Ohi, PhP ne ha a bizzeffe, il saggio
manuale ti verra' certamente in aiuto.
Sperando che quelli che hanno i cookie disabilitati siano tutti
interpreti :)
HAND,
  ngw