Scope e multilingua

This is a discussion on Scope e multilingua within the Il linguaggio di programmazione PHP (it.comp.www.php) forum.

Scope e multilingua

Postby Pictor on Thu Dec 04, 2008 8:25 am

Salve :-)

Sto scrivendo un piccolo CMS multilingua e mi chiedevo come gestire le
localizzazioni.

Per i contenuti dinamici me la sbrigo a livello di struttura di
database e query.
Per quanto riguarda le stringhe statiche invece non ho ancora in mente
un'idea precisa su come fare.

Per adesso all'inizio della pagina metto un

require("lang/$lingua_sigla/local.php");

con $lingua_sigla che contiene IT, EN, FR o altro in base alla lingua
selezionata.

Nel file local.php c'è semplicemente la definizione di costanti, tipo:

DEFINE("STR_Welcome", "Benvenuto nel portale");
DEFINE("STR_Login", "Accedi");
....
etc, etc....



Ho usato delle costanti perchè almeno sono disponibili ovunque.
Se uso delle variabili mi scontro con un problema che ho con PHP che
ancora non riesco ad aggirare: lo SCOPE delle variabili.

Ancora non uso classi (che da questo aspetto mi spaventano ancora di
più!) ma faccio molte funzioncine per le varie funzionalità.

Sfortunatamente se voglio fare una funzione che stampa del testo sono
costretto:
- o a fare la 'global' su ogni singola variabile corrispondente alle
stringhe che mi servono
- o appunto renderle costanti in modo da averle sempre accessibili


Secondo voi qual'è l'approccio migliore e più versatile? In che altro
modo potrei organizzare il tutto?

Inoltre il problema dello scope mi si presenta puntualmente quando
devo effettuare query in una funzione e sono costretto a passare anche
la connessione come parametro (magari mettendolo come opzionale e con
valore di default, ma è scomodo), oppure ad effettuarci una global
(come faccio di solito).


Mi chiarite un pò di queste cavolate che ho nel cervello?

Grazie :-)
Pictor
 
Posts: 23
Joined: Thu Sep 18, 2008 12:20 am

Re: Scope e multilingua

Postby Ugo on Thu Dec 04, 2008 9:08 am

> Sto scrivendo un piccolo CMS multilingua e mi chiedevo come gestire le
> localizzazioni.

Ma, è a scopo didattico?

> Per i contenuti dinamici me la sbrigo a livello di struttura di
> database e query.

ok

> Per quanto riguarda le stringhe statiche invece non ho ancora in mente
> un'idea precisa su come fare.

definisci stringhe statiche e soprattutto il loro scopo

> Per adesso all'inizio della pagina metto un
>
> require("lang/$lingua_sigla/local.php");
>
> con $lingua_sigla che contiene IT, EN, FR o altro in base alla lingua
> selezionata.
>
> Nel file local.php c'è semplicemente la definizione di costanti, tipo:
>
> DEFINE("STR_Welcome", "Benvenuto nel portale");
> DEFINE("STR_Login", "Accedi");
> ....
> etc, etc....

che immagino siano le "stringhe statiche" di cui prima

> Ho usato delle costanti perchè almeno sono disponibili ovunque.

Mmmm

> Se uso delle variabili mi scontro con un problema che ho con PHP che
> ancora non riesco ad aggirare: lo SCOPE delle variabili.

e già è un po' quel problema che si ha un po' con tutti i linguaggi
per fortuna ;)

> Ancora non uso classi (che da questo aspetto mi spaventano ancora di
> più!) ma faccio molte funzioncine per le varie funzionalità.

e già e questo è un problema :(
Cmq vediamo se si riesce a fare qualcosa con la programmazione funzionale

> Sfortunatamente se voglio fare una funzione che stampa del testo sono
> costretto:
> - o a fare la 'global' su ogni singola variabile corrispondente alle
> stringhe che mi servono
> - o appunto renderle costanti in modo da averle sempre accessibili

sì capisco

> Secondo voi qual'è l'approccio migliore e più versatile? In che altro
> modo potrei organizzare il tutto?

non infierendo sull'OOP
ti proporrò 2 approcci a cui non avevi pensato

> Inoltre il problema dello scope mi si presenta puntualmente quando
> devo effettuare query in una funzione e sono costretto a passare anche
> la connessione come parametro

perché sei costretto? se ti connetti ad un solo DB puoi sottintendere tale
parametro che dovrebbe essere facoltativo, cmq anche qui con la
programmazione ad oggetti non avresti avuto grane...

> (magari mettendolo come opzionale e con
> valore di default, ma è scomodo), oppure ad effettuarci una global
> (come faccio di solito).

Mmm?!?!?

> Mi chiarite un pò di queste cavolate che ho nel cervello?
> Grazie :-)

Allora non posso fare miracoli :P
Cmq ti accenno alle 2 soluzioni di cui prima:

quelle che chiami stringhe statiche le puoi mettere nel in una tabella del
DB che avrà almeno le 3 colonne "key", "value" e "lan",
tu prima di ogni script (dopo aver fatto la connessione al DB) lanci la
routine che "carica" le costanti facendo un ciclo sulla query con filtro
della lingua e che creerà le costanti al volo facendo un bel
if( ! defined( $row['key'] ) )
define( $row['key'], $row['value'] );
e voilà se la prima riga della query fosse stata:
"STR_Welcome" | "Benvenuto nel portale" | "it"
ora avresti quella define bella definita

questo approccio potrebbe rivelarsi interessante perchè potresti
aggiungerci altre colonne che potrebbero distinguere per eventuali sezioni
e poi volendo potresti poterne modificare agevolmente attraverso una
maschera del tuo CMS senza dover mettere mano al filesystem...

poi l'altro soluzione è utilizzare una funzione che definisca una variabile
array internamente statica (che temo tu sono sappia cosa sia, nel caso ti
rimando ad una lettura del manuale) che voglia un parametro che
rappresenterebbe il nome della costante e la funzione ne restituirebbe il
valore, questa funzione dovrebbe essere lanciata una prima volta (ad
esempio senza parametri) all'inizio dello script e caricherebbe i valori
nel proprio array (questi potrebbero essere presi da qualsiasi parte file
di configurazione, ini, DB, xml...) e poi ogni qualvolta che ti serve un
certo valore non fai altro che richiamarla passandoglelo come parametro
(eventualmente potrai anche passargli la lingua come secondo...)

detto questo è dovero dirti che oggi come oggi si può affermare che un
approcio diverso dall'OOP è sbagliato e ti creerà solo problemi, visto che
parlavi di modularità e altri "paroloni"...

Ciao
Ugo
 
Posts: 55
Joined: Tue Apr 01, 2008 7:18 am

Re: Scope e multilingua

Postby Pictor on Thu Dec 11, 2008 2:52 am

On 4 Dic, 17:08, Ugo wrote:
> > Sto scrivendo un piccolo CMS multilingua e mi chiedevo come gestire le
> > localizzazioni.
>
> Ma, è a scopo didattico?

No, è il sito per un azienda.
Perchè?

> > Per quanto riguarda le stringhe statiche invece non ho ancora in mente
> > un'idea precisa su come fare.
>
> definisci stringhe statiche e soprattutto il loro scopo

Cosa significa "il loro scopo"? Intendi nel nome?

> > Per adesso all'inizio della pagina metto un
>
> > require("lang/$lingua_sigla/local.php");
[CUT]

> > DEFINE("STR_Welcome", "Benvenuto nel portale");
> > DEFINE("STR_Login", "Accedi");
> > ....
> > etc, etc....
>
> che immagino siano le "stringhe statiche" di cui prima

Yah!

> > Ho usato delle costanti perchè almeno sono disponibili ovunque.
>
> Mmmm

Mh?

> > Se uso delle variabili mi scontro con un problema che ho con PHP che
> > ancora non riesco ad aggirare: lo SCOPE delle variabili.
>
> e già è un po' quel problema che si ha un po' con tutti i linguaggi
> per fortuna ;)

Per fortuna?! :-P
Io programmavo in ASP sino a pochi mesi fa. Lì era molto meno rognoso.

Non so come gestirmi. Se buttarmi sulle global (magari globalizzando
un array con le variabili più comuni) o se costringermi a passare
tutto come parametro (ma troppi parametri mi son sempre sembrati
'brutti' per una funzione).

> > Ancora non uso classi (che da questo aspetto mi spaventano ancora di
> > più!) ma faccio molte funzioncine per le varie funzionalità.
>
> e già e questo è un problema :(

Why?

> Cmq vediamo se si riesce a fare qualcosa con la programmazione funzionale
>
> > Sfortunatamente se voglio fare una funzione che stampa del testo sono
> > costretto:
> > - o a fare la 'global' su ogni singola variabile corrispondente alle
> > stringhe che mi servono
> > - o appunto renderle costanti in modo da averle sempre accessibili
>
> > Secondo voi qual'è l'approccio migliore e più versatile? In che altro
> > modo potrei organizzare il tutto?
>
> non infierendo sull'OOP

E invece infierendo sull'OOP? Come dovrei organizzare il codice?

> ti proporrò 2 approcci a cui non avevi pensato
>
> > Inoltre il problema dello scope mi si presenta puntualmente quando
> > devo effettuare query in una funzione e sono costretto a passare anche
> > la connessione come parametro
>
> perché sei costretto? se ti connetti ad un solo DB puoi sottintendere tale
> parametro che dovrebbe essere facoltativo, cmq anche qui con la
> programmazione ad oggetti non avresti avuto grane...

Sottintendere nel senso di dare un valore di default al parametro
connessione?
E in OOP come sarebbe stato? Perchè non ci sono grane?

> > (magari mettendolo come opzionale e con
> > valore di default, ma è scomodo), oppure ad effettuarci una global
> > (come faccio di solito).
>
> Mmm?!?!?

Assegnare un valore di default ad un parametro di funzione, rendendolo
opzionale nel richiamo, oppure effettuando una global sulla variabile
che identifica la connessione in modo da averla disponibile nella
funzione.

> > Mi chiarite un pò di queste cavolate che ho nel cervello?
> > Grazie :-)
>
> Allora non posso fare miracoli :P

Diamine!

> Cmq ti accenno alle 2 soluzioni di cui prima:
>
> quelle che chiami stringhe statiche le puoi mettere nel in una tabella del
> DB che avrà almeno le 3 colonne "key", "value" e "lan",
> tu prima di ogni script (dopo aver fatto la connessione al DB) lanci la
> routine che "carica" le costanti facendo un ciclo sulla query con filtro
> della lingua e che creerà le costanti al volo facendo un bel
> if( ! defined( $row['key'] ) )
>         define( $row['key'], $row['value'] );
> e voilà se la prima riga della query fosse stata:
> "STR_Welcome" | "Benvenuto nel portale" | "it"
> ora avresti quella define bella definita

Credo che seguirò questo approccio.
Almeno è più veloce l'inserimento di nuove stringhe (senza dover ogni
volta stare a scrivere 'define' o virgolette varie).

> questo approccio potrebbe rivelarsi interessante perchè potresti
> aggiungerci altre colonne che potrebbero distinguere per eventuali sezioni
> e poi volendo potresti poterne modificare agevolmente attraverso una
> maschera del tuo CMS senza dover mettere mano al filesystem...

Sì infatti è ottimo :-)

> poi l'altro soluzione è utilizzare una funzione che definisca una variabile
> array internamente statica (che temo tu non sappia cosa sia, nel caso ti
> rimando ad una lettura del manuale)

Più che non saperlo non so a che cosa ti riferisci.
Dici di usare la 'static'? (sul cui utilizzo ho personalmente ancora
dei dubbi)

Spiegati meglio :-)

> che voglia un parametro che
> rappresenterebbe il nome della costante e la funzione ne restituirebbe il
> valore, questa funzione dovrebbe essere lanciata una prima volta (ad
> esempio senza parametri) all'inizio dello script e caricherebbe i valori
> nel proprio array (questi potrebbero essere presi da qualsiasi parte file
> di configurazione, ini, DB, xml...) e poi ogni qualvolta che ti serve un
> certo valore non fai altro che richiamarla passandoglelo come parametro
> (eventualmente potrai anche passargli la lingua come secondo...)

Mi pare più scomodo questo metodo. Cerco qualcosa che mi renda il
codice pulito e breve.
Anche se dalla sua l'array ha la possibilità di essere incluso in una
double quoted string, senza bisogno di aprire/chiudere virgolette o di
fare concatenazioni. Per una costante è diverso. Non posso inserirla
direttamente in una stringa, no?

> detto questo è dovero dirti che oggi come oggi si può affermare che un
> approcio diverso dall'OOP è sbagliato e ti creerà solo problemi, visto che
> parlavi di modularità e altri "paroloni"...

Speravo di arrivarci per gradi. Conosco le basi dell'OOP ma non mi
sono mai trovato a tirar su un progetto basato su quella. Quindi
l'espeirenza che ho è nello scrivere ogni tanto qualche funzioncina.
La teoria più o meno ce l'ho.... sono la pratica e il sapere quando/
come va usata che mi mancano...

> Ciao

Ciao :-}
Pictor
 
Posts: 23
Joined: Thu Sep 18, 2008 12:20 am

Re: Scope e multilingua

Postby Ugo on Thu Dec 11, 2008 6:26 am

[premessa]

Questo sarebbe potuto essere un 3D interessante con molti post a cui
prendere consigli e/o ispirazione, però la tua risposta si è fatta un po'
troppo attendere...

>>> Sto scrivendo un piccolo CMS multilingua e mi chiedevo come gestire le
>>> localizzazioni.
>>
>> Ma, è a scopo didattico?
>
> No, è il sito per un azienda.
> Perchè?

Era bene saperlo perché in questo caso la curva di apprendimento sarebbe
incompatibile con i tempi di produzione/consegna, quindi si evitano certi
discorsi andando subito ai vari punti delle questioni senza perdere tempo
prezioso :)

>>> Per quanto riguarda le stringhe statiche invece non ho ancora in mente
>>> un'idea precisa su come fare.
>>
>> definisci stringhe statiche e soprattutto il loro scopo
>
> Cosa significa "il loro scopo"? Intendi nel nome?

No, intendevo il loro utilizzo e modalità d'impiego...
ma direi che le idee me le sono chiarite in seguito....

>>> Ho usato delle costanti perchè almeno sono disponibili ovunque.
>>
>> Mmmm
>
> Mh?

perché ci sono anche altre "cose" che possono essere disponibili ovunque
senza l'aggiunta di clausole global (che se non dico caxxate a partire da
php6 spariscde pure...)
di quelle che mi vengono in mente al volo ora sono:
classe singleton
classe statica
funzione "statica"
variabile superglobale $GLOBALS

> Non so come gestirmi. Se buttarmi sulle global (magari globalizzando
> un array con le variabili più comuni) o se costringermi a passare
> tutto come parametro (ma troppi parametri mi son sempre sembrati
> 'brutti' per una funzione).

OOP

[cut]
>>> Ancora non uso classi (che da questo aspetto mi spaventano ancora di
>>> più!) ma faccio molte funzioncine per le varie funzionalità.
>>
>> e già e questo è un problema :(
>
> Why?

eh, perché con la programmazione ad oggetti puoi strutturare il tuo codice
implementando i cosidetti "pattern" studiati da dei capoccia per affrontare
tutte queste problematica note e risolte... diciamo così...

[cut]
>> non infierendo sull'OOP
>
> E invece infierendo sull'OOP? Come dovrei organizzare il codice?

eh, non è una cosa che si risolve/risponde con un post, cmq se proprio devi
studiarti qualcosa forse ti consiglierei di usare un framework che ti
"costringe" e ti aiuta in queste cose... però per il prossimo lavoro direi,
perché i tempi di apprendimento normalmente non sono compatibili... come
dicevo prima...

[cut]
> Sottintendere nel senso di dare un valore di default al parametro
> connessione?

nel senso che le funzioni mysql_*( ) hanno tutte il parametro opzionale in
coda ai parametri, ciò vuol dire che tu potresti non metterci un bel niente
e se hai fatto una sola connessione al DB viene dedotta in automatico senza
doverti trascinare variabili...

> E in OOP come sarebbe stato? Perchè non ci sono grane?

perché la "varibile di connessione" sarebbe messa in una qualche variabile
privata e l'istanza della tua classe o meglio i metodi che useresti
potranno "consultarna" quando vogliono e in maniera indolore potresti fare
2 connessioni contemporanee equivalenti, es:

$db1 = new mysql( DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE );
$db1->connect( );
$db1->query( $sql );
...
$db2 = new mysql( DB_SERVER2, DB_USERNAME2, DB_PASSWORD2, DB_DATABASE2 );
$db2->connect( );
$db2->query( $sql2 );

[cut]
>> poi l'altro soluzione è utilizzare una funzione che definisca una variabile
>> array internamente statica (che temo tu non sappia cosa sia, nel caso ti
>> rimando ad una lettura del manuale)
>
> Più che non saperlo non so a che cosa ti riferisci.
> Dici di usare la 'static'? (sul cui utilizzo ho personalmente ancora
> dei dubbi)



> Spiegati meglio :-)

te l'ho detto dai un'occhiata al manuale, cmq
l'implementazione/utilizzo/funzionalità delle variabili statice all'interno
delle funzioni in PHP sono equivalenti agli altri linguaggi

> Mi pare più scomodo questo metodo. Cerco qualcosa che mi renda il
> codice pulito e breve.

Beh, breve potrebbe anche esserlo:

CONST_DEFAULT_LANGUAGE -> 'it'
cfg('Default_Language') -> 'it'

> Anche se dalla sua l'array ha la possibilità di essere incluso in una
> double quoted string, senza bisogno di aprire/chiudere virgolette o di
> fare concatenazioni.

esiste anche l'escape...

> Per una costante è diverso.

Mmm, mi sa' che non ho capito

> Non posso inserirla direttamente in una stringa, no?

cosa?
define( CIPPO, "ehila'" );
define( CIPPO, 'ehila\'' );

più che altro che nelle costanti puoi mettere solo stringhe o numeri, in
una variabile (dell'array) puoi metterci tutto

> Speravo di arrivarci per gradi.

ecco la mia domanda iniziale cioè se era a scopo didattico...

> Conosco le basi dell'OOP ma non mi
> sono mai trovato a tirar su un progetto basato su quella.

e ma non sarebbe così semplice, visto per altro che si parla di CMS...

> Quindi
> l'espeirenza che ho è nello scrivere ogni tanto qualche funzioncina.
> La teoria più o meno ce l'ho.... sono la pratica e il sapere quando/
> come va usata che mi mancano...

Ti capisco bene, perché ci sono passato anch'io...

> Ciao :-)

Ciao
Ugo
 
Posts: 55
Joined: Tue Apr 01, 2008 7:18 am

Re: Scope e multilingua

Postby Alessandro Pellizzari on Thu Dec 11, 2008 7:12 am

Il Thu, 04 Dec 2008 07:25:01 -0800, Pictor ha scritto:

> Sto scrivendo un piccolo CMS multilingua e mi chiedevo come gestire le
> localizzazioni.
> Per quanto riguarda le stringhe statiche invece non ho ancora in mente
> un'idea precisa su come fare.

I maggiori progetti opensource (Drupal, Wordpress, ecc.) in PHP usano
gettext():

http://it.php.net/manual/en/book.gettext.php

Che e` quello che ti consiglio anche io, se hai gente un minimo capace a
mettere le mani nelle traduzioni. Tradotto: non basta modificare un file
di testo, devi anche compilarlo, oppure editarlo con un software apposito
come POEdit.

> Ancora non uso classi (che da questo aspetto mi spaventano ancora di
> più!) ma faccio molte funzioncine per le varie funzionalità.

Le classi invece ti risolverebbero diversi problemi.
Per esempio puoi fare una classe "Locale" che contiene un'attributo (una
variabile) $lingua, e tutti i metodi (funzioni) della classe farebbero
riferimento alla variabile $lingua della loro classe, senza bisogno di
passarla e ripassarla avanti e indietro.

> Inoltre il problema dello scope mi si presenta puntualmente quando devo
> effettuare query in una funzione e sono costretto a passare anche la
> connessione come parametro (magari mettendolo come opzionale e con
> valore di default, ma è scomodo), oppure ad effettuarci una global (come
> faccio di solito).

Stessa cosa. Una classe "TabellaDB" a cui passi, in fase di creazione, la
connessione al DB e i cui metodi (select(), query(), update(), ecc.) usano
direttamente la variabile impostata nella classe.

Bye.
Alessandro Pellizzari
 
Posts: 181
Joined: Wed Jul 02, 2003 8:01 am


Return to Il linguaggio di programmazione PHP (it.comp.www.php)

Who is online

Users browsing this forum: No registered users and 0 guests