Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di erosmax
    Registrato dal
    Jan 2003
    Messaggi
    119

    [VB6] Richiamare la lingua dal file di risorse... si può?

    Volevo chiedere se era possibile richiamare una lingua dal Menù, scegliendo la lingua da utilizzare, se questa è inclusa nella sezione "Tabela Stringhe" del file di risorse.
    Se si, come fare?
    Se no... essendo il programma datato, lungo e complesso, per rimetterci le mani sopra senza creare guai, c'è una soluzione senza dover cambiare codice?


    Grazie.
    Non ho nulla da dire...e lo stò dicendo!
    - Scarica i miei Software FREE

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    A quale voce di menu di quale programma fai riferimento?
    Se il programma è tuo, ciò che è possibile fare dipende da come lo hai scritto e realizzato.

    Inoltre, qual è la "tabella di stringhe" di cui parli?

    Per favore, cerca di spiegare meglio qual è il problema, lo scenario in cui si verifica, il punto di partenza e l'obiettivo principale.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Con VB6 non puoi, poi in ogni caso devi mettere mano al progetto per far caricare le stringhe.
    Se ti accontenti di tenere le stringhe in un semplice file LNG (in formato INI) puoi scaricarti il mio add-in MLS (Multi-Language_Support) con sorgente incluso.

    In pratica l'add-in elabora completamente il progetto, ed alla fine te lo ritrovi già funzionante con il menu per le lingue.
    Alla fine sono generati 2 file (ITA.LNG e ENG.LNG) con le stringhe usate nel programma.
    Naturalmente le stringhe del file ENG.LNG le devi tradurre tu.

    L'importante è che nel tuo progetto siano definite bene quali sono le costanti (che non vanno mai tradotte) e le variabili.
    IMPORTANTE: inoltre c'è la possibilità di impostare delle keywords per cui quando MLS trova una riga con una keyword non la elabora (es. le query).

    lo trovi qui
    http://www.vbcorner.net/

  4. #4
    Utente di HTML.it L'avatar di erosmax
    Registrato dal
    Jan 2003
    Messaggi
    119
    ....Gasp ma allora sei tu!
    Ti avevo scritto via email per il fatto che non vi era la traduzione simultanea!
    Ora sto utilizzando il tuo programma, caro Gibra, modificando i file di uscita per facilitare la traduzione.
    Peccato, perché pensavo che c'era un comando per far capire al computer di utilizzare una o l'altra lingua (che ne so, ingannandolo inviando un dato sullo status delle lingue della macchina, visto che questi riconosce la lingua in base al setlingua settato)

    Una domandina da dilettante... Se il mio software ha solo 2 lingue nel file di risorse (Italiano ed Inglese), se a scaricarlo è una persona che ha Winzoz settato su Cinese o Tedesco, in quale linguaggio gli partirà il mio software?
    Cioè, non trovando una delle 2 lingue, posso settarlo sull'inglese?
    A me basterbbe questo!


    Ciao e grazie
    Non ho nulla da dire...e lo stò dicendo!
    - Scarica i miei Software FREE

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Certo che si può.

    Infatti vi sono apposite funzioni API atte a gestire la LOCALE del computer.
    Ad esempio con GetLocaleInfo() o GetLocaleInfoEx() che tramite le relative costanti ti permette di recuperare tutte le informazioni sulla lingua corrente:
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Una volta ricavata la lingua del sistema in uso, se non è inclusa nel programma allora si fa partire come default la lingua inglese (ENG).

  6. #6
    Utente di HTML.it L'avatar di erosmax
    Registrato dal
    Jan 2003
    Messaggi
    119
    Grazie per la risposta.
    Nel frattempo ho optato per una mossa truffaldina ... cioè ho eliminato la Tabella Stringhe in inglese e l'ho accorpata a quella italiana partendo da un ID paro (+200) rispetto a quello di partenza.
    In questo modo, facendo un Replace su tutto il sorgente, ho aggiunto a LoadResString( una variabile globale assegnata al click della lingua sul Menu.
    Non ho nulla da dire...e lo stò dicendo!
    - Scarica i miei Software FREE

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Vi sono pro e contro, nell'usare questa tecnica (a mio avviso poco pratica):
    1 - tutte le stringhe essendo inglobate nell'exe occupano memoria inutilmente, quando invece di lingue se ne usa solo una alla volta (e di norma l'utente non la cambia più).
    Il che significa che se hai 4 lingue avrai <n> risorse stringa moltiplicate per 4, uno spreco enorme
    2 - ad ogni modifica di una stringa, devi ridistribuire l'eseguibile (es. un'errore ortografico).
    3 - se devi aggiungere una lingua, devi modificare la risorsa, compilare e ridistribuire l'eseguibile, e qui si aggiunge anche il problema del versioning.

    Sembra una bazzecola, invece con i S.O. moderni per aggiornare un'eseguibile non è più possibile 'copiarlo' nella cartella di installazione (Programmi) come si poteva fare (anche se non sempre) con Windows XP.
    Oggi devi creare un vero setup di aggiornamento con tutto quello che ne consegue.

    Se proprio vuoi usare un file di risorse, allora è sicuramente preferibile usare come risorsa una DLL satellite, così se aggiungi una nuova lingua:
    1) non devi ricompilare l'exe
    2) la puoi installare in qualsiasi cartella (NON deve essere nella cartella <Programmi>)
    3) non serve registrarla
    4) in caso di aggiornamento:
    - non è necessario creare un setup di aggiornamento.
    - basta semplicemente copiare la DLL nella cartella e sovrascrivere la vecchia DLL


    Se ti interessa e non sai come creare una DLL satellite trovi le istruzioni in questo mio vecchio articolo:
    Come utilizzare le icone a 32bit di Windows XP
    http://www.visual-basic.it/areaarticoli.asp

    è davvero banale: dato che hai già creato il file RES ti basta solo compilare la DLL, e la routine che accede alla risorsa.
    nel progetto di esempio allegato all'articolo trovi il codice, semplicissimo.

  8. #8
    Utente di HTML.it L'avatar di erosmax
    Registrato dal
    Jan 2003
    Messaggi
    119
    Ti ringrazio, avevo già letto il tuo articolo ma non mi ci ero mai dedicato.
    Io, la mia res, l'ho creata con l'Editor di Risorse e, oltre alle stringhe delle lingue, ha anche icone, immagini, etc.
    Tu mi consigli di creare una DLL... ma, in questo caso, dovrei scomporre il mio file .RES estrapolando le lingue o il tutto?
    Poi, dici di creare una DLL per ogni singola lingua o un unica DLL?
    Ho dato un'occhiata al tuo programma ma, non avendo mai usato DLL, devo ammettere di essermi trovato in difficoltà.
    Non so proprio da dove partire per leggere la DLL!
    Ho trovato una tua vecchia discussione su un altro forum dove consigliavi:

    codice:
    Public Function GetResString(ByVal hInst As Long, ByVal ID As Long) As String     
             Dim lResult As Long     
             Dim sBuffer As String * 200     
             lResult = LoadString(hInst, ID, sBuffer, 200)      
             GetResString = Left$(sBuffer, lResult)      
    End Function
    e nel Form

    codice:
    Label1.Caption = GetResString(hInst, ID)
    Logicamente dava errore sulla LoadString (avevo messo anche un
    codice:
    hInst = LoadLibrary("prova.dll")
    Così ho creato un Modulo e messo:
    codice:
    Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Public Declare Function LoadString Lib "user32" Alias "LoadStringA" (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, ByVal nBufferMax As Long) As Long
    .... ma in Label non appare nulla

    In questo mi trovo proprio in alto mare e forse mi rimane restare nella mia mrdiocrità!
    Non ho nulla da dire...e lo stò dicendo!
    - Scarica i miei Software FREE

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da erosmax
    Io, la mia res, l'ho creata con l'Editor di Risorse e, oltre alle stringhe delle lingue, ha anche icone, immagini, etc.
    Tu mi consigli di creare una DLL... ma, in questo caso, dovrei scomporre il mio file .RES estrapolando le lingue o il tutto?
    Te l'avevo già scritto: non devi fare niente!
    Puoi utilizzare il TUO file RES, basta solo compilare la DLL.

    Originariamente inviato da erosmax
    Poi, dici di creare una DLL per ogni singola lingua o un unica DLL?
    Puoi fare uno o l'altro, dipende dalle esigenze.

    Se metti tutte le lingue insieme sei costretto ad anteporre l'offset all'ID della risorsa lingua corrente.
    Se crei una DLL per ogni lingua l'ID della risorsa resta sempre quello, in più puoi localizzare anche le immagini (ad esempio se contengono testo)

    Originariamente inviato da erosmax
    Ho dato un'occhiata al tuo programma ma, non avendo mai usato DLL, devo ammettere di essermi trovato in difficoltà.
    Ovvio, questo vale per tutte le cose che si affrontano per la prima volta.

    Originariamente inviato da erosmax
    Logicamente dava errore sulla LoadString (avevo messo anche un
    codice:
    hInst = LoadLibrary("prova.dll")
    Dubito che questa istruzione possa funzionare.
    - Dov'è posizionato il file 'prova.dll'?
    - che valore contiene hInst dopo la chiamata?

  10. #10
    Utente di HTML.it L'avatar di erosmax
    Registrato dal
    Jan 2003
    Messaggi
    119
    Originariamente inviato da gibra
    Dubito che questa istruzione possa funzionare.
    - Dov'è posizionato il file 'prova.dll'?
    - che valore contiene hInst dopo la chiamata?
    Il file prova.dll è posizionato dove si trova il programma di prova che ho fatto.
    hInst contiene un valore 58589184 mentre allìinterno del sBuffer non vi è nulla se non 200 caratteri nulli "r"
    Non ho nulla da dire...e lo stò dicendo!
    - Scarica i miei Software FREE

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.