Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Resource String per Messagi in lingue diverse

61 views
Skip to first unread message

Maurizio

unread,
Mar 18, 2013, 12:10:52 PM3/18/13
to
Ho necessita' di aggiungere altre lingue
usare una unit con resoursestring e' ancora
una buona idea ?

Delphi XE2/XE3 vcl

unit rsPulsanti;

interface

resourcestring

{Inglese}
EN_User = 'User Name';
EN_Password = 'Password';

{Italiano}
IT_User = 'Nome Utente';
IT_Password = 'Password';

{Ucraino}
UC_User = 'Iм'+ #39 + 'я користувача';
UC_Password = 'Nароль';

implementation
end.

che uso cosi'
.. uses rcPulsanti

EdUtente.Text := rsPulsanti.UC_User;
EdPassword.Text := rsPulsanti.UC_Password;

Alberto Salvati

unread,
Mar 18, 2013, 12:53:55 PM3/18/13
to
Onestamente, non ho capito come fa la tua app a capire quali strinhe deve usare.

A.




Maurizio

unread,
Mar 18, 2013, 1:06:02 PM3/18/13
to
Il 18/03/2013 17:53, Alberto Salvati ha scritto:
>> Onestamente, non ho capito come fa la tua app a capire quali strinhe deve usare.
>>
>> A.
il suffisso UC_ o IT_

EdUtente.Text := rsPulsanti.UC_User; //Ucraino
EdUtente.Text := rsPulsanti.IT_User; //Italiano

Alberto Salvati

unread,
Mar 18, 2013, 1:24:31 PM3/18/13
to
IO HO SCRITTO QUESTO:

> Onestamente, non ho capito come fa
> la tua app a capire quali strinhe deve usare.

PROBABILMENTE, NON SO PIU' SCRIVERE IN ITALIANO.
DOMANI TROVO UNA INSEGNANTE DI SOSTEGNO E RICOMINCIO DALL'ALFABETO.
IO QUA SOTTO LEGGO DUE ASSEGNAZIONI.

EdUtente.Text := rsPulsanti.UC_User; //Ucraino
EdUtente.Text := rsPulsanti.IT_User; //Italiano

FORSE TU VIVI NELLA 78A DIMENSIONE.. IO NO.
E IN QUESTA DIMENSI0NE LA 2A ASSEGNAZIONE SOVRASCTIVE LA 1A.
QUINDI, IL TEXT SARA SEMPRE IN ITALIANO.

QUINDI, CI DEVE ESSERE *QUALCOSA* CHE DICA AL SOFTWARE SE USARE
*UC_USER* OPPURE *IT_USER*, GIUSTO?

LA MIA DOMANDA QUINDI E': COSA E' QUESTO FOTTUTO *QUALCOSA*??????
CIOE':
COME CAZZO FA LA TUA APP A CAPIRE SE DEVE USARE UC_USER O IT_USER???


Grazie.

A.

Morde

unread,
Mar 18, 2013, 1:46:11 PM3/18/13
to
On 18.03.2013 17:10, Maurizio wrote:
> Ho necessita' di aggiungere altre lingue
> usare una unit con resoursestring e' ancora
> una buona idea ?
>
> Delphi XE2/XE3 vcl
E' sempre una buona idea usare le resourcestring, perchè centralizzano
il messaggio.
Una volta usate le resourcestring, usa un tool che permette di tradurle
e ricompilare il tuo programma nella lingua destinazione.
Uno di questi che ho usato in un'azienda dove ho lavorato si chiama
sisulizer (http://www.sisulizer.com)
cerca che ce ne sono in giro anche di simili.

il concetto di funzionamento è il seguente: tutti i tuoi controlli usano
le resourcestrings.
con il tool di localizzazione devi andare a tradurre tutte le
resourcestring nelle lingue desiderate.
il tool poi ricompila per te il programma in modo che tu non devi
cambiare il tuo codice in funzione della locale.
Avrai così una versione in italiano, una in inglese, una in ucraino,
ecc... tu ti devi solo preoccupare di usare le resourcestring.

ciao

ciao

--
morde
Android
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database

Maurizio

unread,
Mar 18, 2013, 2:11:25 PM3/18/13
to
Il 18/03/2013 18:24, Alberto Salvati ha scritto:
>> IO HO SCRITTO QUESTO:
>>
>>> Onestamente, non ho capito come fa
>>> la tua app a capire quali strinhe deve usare.
>>
>> PROBABILMENTE, NON SO PIU' SCRIVERE IN ITALIANO.
>> DOMANI TROVO UNA INSEGNANTE DI SOSTEGNO E RICOMINCIO DALL'ALFABETO.
>> IO QUA SOTTO LEGGO DUE ASSEGNAZIONI.
>>
>> EdUtente.Text := rsPulsanti.UC_User; //Ucraino
>> EdUtente.Text := rsPulsanti.IT_User; //Italiano
>>
>> FORSE TU VIVI NELLA 78A DIMENSIONE.. IO NO.
>> E IN QUESTA DIMENSI0NE LA 2A ASSEGNAZIONE SOVRASCTIVE LA 1A.
>> QUINDI, IL TEXT SARA SEMPRE IN ITALIANO.
>>
era solo un esempio di assegnazione
quella reale e' del primo post.

EdUtente.Text := rsPulsanti.UC_User;
EdPassword.Text := rsPulsanti.UC_Password;

se invece che UC_User scrivo IT_User cambia senza che io deva
fare chissa' cosa per farglelo capire

>> QUINDI, CI DEVE ESSERE *QUALCOSA* CHE DICA AL SOFTWARE SE USARE
>> *UC_USER* OPPURE *IT_USER*, GIUSTO?
>>
una variabile locale del tipo iLingua: integer;

>> LA MIA DOMANDA QUINDI E': COSA E' QUESTO FOTTUTO *QUALCOSA*??????
>> CIOE':
>> COME CAZZO FA LA TUA APP A CAPIRE SE DEVE USARE UC_USER O IT_USER???
>>
>>
che puo' essere 0 : Inglese; 1 : Italiano , etc

Case iLingua of
0 : begin
EdUtente.Text := rsPulsanti.EN_User;
EdPassword.Text := rsPulsanti.EN_Password;
end;
1 : begin
EdUtente.Text := rsPulsanti.IT_User;
EdPassword.Text := rsPulsanti.IT_Password;
end;
end;

che pero' risulta scomodo, altra via quella del Define
cambio il nome delle unit ma uso sempre User e non
IT_User

{$DEFINE LANG_UCR}
uses

{$IfDef LANG_UCR}
rsPulsantiUCR;
{$EndIf}
{$IfDef LANG_ITA}
rsPulsantiITA;
{$EndIf}

ma devo trovare modo di creare un riferimento per Resource string
del tipo aLingua := rsPulsantiITA e poter usare

aLingua.EdUtemte.Text := User;

ma qui mi fermo, non so se sia possibile.

Alberto Salvati

unread,
Mar 19, 2013, 4:23:07 AM3/19/13
to
> una variabile locale del tipo iLingua: integer;

Caption di form, label, messaggi di avviso o di errore....
Se nella tua app hai 5000 stringhe x 4 lingue fai 20.000 if??
Io SPORCO il codice inserendo un if o un case ogni volta che devo usare una stringa? Ti sembra una cosa SENSATA?
Non ti viene in mente che FORSE c'e' un sistema piu' pulito e comodo, che non fa uso di IF cinofallici?
Ti prego, dimmi che ORA NON LAVORI COSI.......

> usare una unit con resoursestring e' ancora una buona idea ?

L'idea di usare una unit con le stringe sotto resourcestring ha degli ovvi (ma non per tutti) pro e contro.

Ma a prescindere da dove le metti, comncia a vedere dalla guida in linea a cosa serve il RESOURCE DLL WIZARD e scoprirai il magico mondo dei file di risorse e del mitico resource compiler.
Se poi non ti basta vedi anche questo che non è agratis:

http://www.sisulizer.com

Altro che IF come se piovesse.....




A.

Maurizio

unread,
Mar 19, 2013, 9:49:57 AM3/19/13
to
Il 19/03/2013 09:23, Alberto Salvati ha scritto:
>>> una variabile locale del tipo iLingua: integer;
>>
>> Caption di form, label, messaggi di avviso o di errore....
>> Se nella tua app hai 5000 stringhe x 4 lingue fai 20.000 if??
>> Io SPORCO il codice inserendo un if o un case ogni volta che devo usare una stringa? Ti sembra una cosa SENSATA?
>> Non ti viene in mente che FORSE c'e' un sistema piu' pulito e comodo, che non fa uso di IF cinofallici?
>> Ti prego, dimmi che ORA NON LAVORI COSI.......
>>
non lavoro cosi' perche' non avevo necessita' di varie traduzioni
>>> usare una unit con resoursestring e' ancora una buona idea ?
>>
>> L'idea di usare una unit con le stringe sotto resourcestring ha degli ovvi (ma non per tutti) pro e contro.
>>
pro:
-la manutenzione di un file .pas e' certamente agevole
-usare {$Define }
contro:
-manca di flessibilita' tipo inserire le voci in un Db
-{$Ifdef } non basta devo fare riferimento al nome della unit
es: rsPulsanti.EdUser.text ...
ma devo avere le unit con lo stesso nome in directory diverse
e di volta in volta copiare quella che serve nel progetto

>> Ma a prescindere da dove le metti, comncia a vedere dalla guida in linea a cosa serve il RESOURCE DLL WIZARD e scoprirai il magico mondo dei file di risorse e del mitico resource compiler.
>> Se poi non ti basta vedi anche questo che non � agratis:
>>
>> http://www.sisulizer.com
>>
>> Altro che IF come se piovesse.....
>>
hai ragione non si possono avere n mila If

creare un file .rc e compilare, sicuramente sara' migliore
ma meno rapido, inoltre nelle opzioni Progetto va selezionata
la lingua aggiuntiva.

opto per una classe, in una unit separata che e' piu' flessibile sia del
resourcestring che del .rc

una prima idea e' qualcosa di simile;
quando creo il Form richiesto carico anche i messaggi dal Db realtivi
a quella sezione (diciamo un 150-200 stringhe per i form complessi)

type TLingue = class

private

public
procedure CaricaMessaggi(sLingua: string; var sMsg: TStringList);
end;

l'idea del resourcestring non e' adatta in questa situazione.

Alberto Salvati

unread,
Mar 19, 2013, 10:23:37 AM3/19/13
to
> -la manutenzione di un file .pas e' certamente agevole
> -usare {$Define }

usare define è un vantaggio?

> contro:
> -manca di flessibilita' tipo inserire le voci in un Db

e quella è flessibilita'?

> -{$Ifdef } non basta devo fare riferimento al nome della unit
> es: rsPulsanti.EdUser.text ...
> ma devo avere le unit con lo stesso nome in directory diverse

???

> e di volta in volta copiare quella che serve nel progetto

FOLLIA.

Mi sa che parliamo prp 2 lingue diverse....Cerco di chiarire.

Avere le stringhe su db vuol dire:
a) avere almeno una tabella sul db da gestire
b) avere DEL CODICE DA TESTARE per MAPPARE quanto letto dal db
c) RALLENTARE TUTTO A RUNTIME
d) perdere di immediatezza in fase di sviluppo.

il tutto senza contare che ci sono tante stringhe che sono scritte nelle property di componenti visuali.

Accantoniamo quindi questa NON-SOLUZIONE. Riguardo il "dove" mettere le stringhe:

caso 1:
ho una E UNA SOLA UNIT con tutte le stringhe sotto una sezione resourcestring
Pro: le stringhe sono tutte in un posto
contro: potrebbero rimanere dentro stringhe non piu' utilizzate

caso 2:
ogni form, classe o quello che è si porta dietro le sue stringhe sotto resourcestrng
pro: le becchi subito quando le cerchi, vedi subito se serve o no
contro: se la stessa stringa è usata da piu form/class/unit/etc potresti avere delle ridondanze.

caso 3:
unici i 2 precedenti....
Una unit con le stringhe "comuni", tutte sotto resourcestring e quelle specifiche in ogni singola unit/class/form/etc.

In questi 3 casi, dai il tuo exe in paso al resource dll wizard e ottieni una DLL per ogni lingua indicata. Questa dll contiene ls stringhe etichettate da resourcestring e QUELLE DEI COMPONENTI VISUALI.


> hai ragione non si possono avere n mila If

no....si possono anche avere n-mila if...SE SERVE...

> creare un file .rc e compilare, sicuramente sara' migliore
> ma meno rapido, inoltre nelle opzioni Progetto va selezionata
> la lingua aggiuntiva.

Ma il resource dll wizard LO HAI VISTO O PROVATO ALMENO UNA VOLTA, SI O NO?


> opto per una classe, in una unit separata che e' piu' flessibile sia del
> resourcestring che del .rc

Che significa "piu' flessibile"?
RC non si usa *direttamente* da anni: CI PENSA IL RESOURCE DLL WIZARD!

> una prima idea e' qualcosa di simile;
> quando creo il Form richiesto carico anche i messaggi dal Db realtivi
> a quella sezione (diciamo un 150-200 stringhe per i form complessi)

...200 stringhe un form complesso??
10 edit di vario tipo con relative label e sei già a 20 stringhe.
caption di groupbox, tabsheets, radiogroup, menu..
E per ognuno di essi i relativi hint.
Senza contare messaggi vari...

> l'idea del resourcestring non e' adatta in questa situazione.

Io finora non ho visto "situazioni".
Ho visto solo un "faccio cosi?" seguito da un "faccio cosi!".
Contento tu....


A.
0 new messages