Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Gennaio 12, 2013, 04:08:32 pm

Titolo: Traduzioni in italiano
Inserito da: bonmario - Gennaio 12, 2013, 04:08:32 pm
Ciao a tutti,
è tutta mattina che divento scemo con una cosa che ho sempre fatto e che adesso non mi funziona più.
Allora, in alcuni progetti, io uso questo codice per emettere il giorno della settimana (Lunedì, Martedì, ecc):
Codice: [Seleziona]
DefaultFormatSettings.LongDayNames[DayOfWeek(WrkData)]
Se vado sulla parola DefaultFormatSettings e faccio CTRL + Click, mi apre il sorgente sysinth.inc, dove trovo i valori di LongDayNames alla penultima riga, che però sono in inglese.
Li modifico in italiano, salvo e rifaccio la build di Lazarus.
Riapro il mio progetto, lo compilo, ma mi da sempre i giorni in inglese.

N.B. La modifica del sorgente che ho descritto sopra, è solo a titolo di esempio: ho da anni un programma che mi traduce quelle descrizioni in italiano e che lancio ogni volta prima di rifare la build di Lazarus, ma da qualche tempo, qui a casa non mi funziona più (Ubuntu 64 bit).
Al lavoro, su windows, funziona ancora tutto bene come sempre.

Qualcuno ha qualche idea?

Grazie in anticipo, Mario
Titolo: Re:Giorni della settimana in italiano
Inserito da: Stilgar - Gennaio 12, 2013, 05:28:08 pm
Scusa, sono rinco di mio.
Modifichi l'rtl così, al volo?
Non puoi fare la modifica runtime al volo all'avvio del programma?
Ci sono milioni di modi per farlo.
Perchè abbia smesso di farlo non ne ho idea.
I path immagino tu li abbia già controllati, cambiato qualche cosa a livello di "lettura" del file? Non so, canna a leggere i dati?
Hai fatto qualche aggiornamento prima che smettesse di funzionare?
In alternativa c'è :
http://wiki.freepascal.org/Translations_/_i18n_/_localizations_for_programs
Titolo: Re:Giorni della settimana in italiano
Inserito da: bonmario - Gennaio 12, 2013, 07:33:55 pm
No, modifico il sorgente di FPC, poi rifaccio la build di Lazarus e, da quel momento in poi, tutti i programmi in cui ho bisogno il giorno della settimana, dovrebbero avere le traduzioni italiane.
I percorsi ed il resto mi sembrano Ok, anche perché quando faccio il CTRL + Click su DefaultFormatSettings mi apre il sorgente modificato da me.
Io Lazarus lo aggiorno da SVN e lo ricompilo almeno un paio di volte al mese, quindi non mi sono reso conto di preciso quando questa cosa ha smesso di funzionare

Non puoi fare la modifica runtime al volo all'avvio del programma?

Intendi dire di fare io una procedura che mi restituisce i giorni in italiano? Se è così, potrei farlo in pochissimo tempo, ma sarei curioso di capire perché il metodo che ho usato per anni non funziona più !!!!

Ciao, Mario
Titolo: Re:Giorni della settimana in italiano
Inserito da: nomorelogic - Gennaio 12, 2013, 07:44:38 pm
se non sbaglio è la seconda volta che in questo forum leggo che modifichi il codice di fpc per "fare prima".
direi che il motivo per cui al mondo ci sono molte guerre è perché in molti hanno riscritto la Bibbia a loro modo. :D

scherzi a parte, le tue applicazioni non possono e non devono dipendere da queste modifiche, soprattutto per problemi come la localizzazione.

dovresti farti una unit dove ridefinisciti le tue cose e la usi in ogni tuo progetto.
altrimenti sei condannato alla modifica perpetua ad ogni cambio di versione o OS, senza contare che non potrai condividere il tuo codice con nessuno...

segui il consiglio, rimetti a posto il sorgente e lavora di tuo ;)
Titolo: Re:Giorni della settimana in italiano
Inserito da: bonmario - Gennaio 12, 2013, 11:21:48 pm
Hai ragione, quella era una soluzione che avevo trovato anni fa', quando non avevo ancora un accesso costante ad internet per documentarmi, e mi arrangiavo spulciando i sorgenti.
Ho già una funzione "GiornoDellaSettimana" in cui richiamo l'istruzione che ho scritto nel primo post che ho modificato per sistemare il problema.
Ero solo curioso di capire coma mai quella soluzione non funziona più !!!!

P.S. Un chiarimento: quando nella tua prima risposta hai scritto
Codice: [Seleziona]
Non puoi fare la modifica runtime al volo all'avvio del programma?

Intendevi appunto scrivere una routine che mi restituisce i giorni in italiano, oppure c'è un metodo che non conosco di forzare a runtime quello che sarebbe l'esito di
Codice: [Seleziona]
DefaultFormatSettings.LongDayNames[DayOfWeek(WrkData)]

Ciao, Mario
Titolo: Re:Giorni della settimana in italiano
Inserito da: Legolas - Gennaio 12, 2013, 11:55:14 pm
Strano, DefaultFormatSettings viene inizializzato automaticamente con i valori propri della lingua del sistema operativo. Senza fare modifiche, a me restituisce i nomi dei giorni in italiano.

Se vuoi darci un'occhiata, si trova tutto in sysutils. La procedura InitInternational, tra le varie cose, fa una chiamata a GetFormatSettings, che esegue GetlocaleFormatSettings(GetThreadLocale, DefaultFormatSettings). La procedura GetlocaleFormatSettings assegna a DefaultFormatSettings dei valori, a seconda di quanto restituito dalla funzione GetThreadLocale del kernel, che restituisce appunto la lingua di sistema. Questo su windows, su altre piattaforme dovrebbe funzionare alla stessa maniera  :)
Titolo: Re:Giorni della settimana in italiano
Inserito da: bonmario - Gennaio 13, 2013, 11:06:25 am
Questo su windows, su altre piattaforme dovrebbe funzionare alla stessa maniera  :)

Grazie della spiegazione, probabilmente questo è il motivo per cui al lavoro funziona (Windows), ma qui a casa no (Linux).

Questa è la InitInternational di Windows:
Codice: [Seleziona]
Procedure InitInternational;
var
  { A call to GetSystemMetrics changes the value of the 8087 Control Word on
    Pentium4 with WinXP SP2 }
  old8087CW: word;
  DefaultCustomLocaleID : LCID;   // typedef DWORD LCID;
  DefaultCustomLanguageID : Word; // typedef WORD LANGID;
begin
  /// workaround for Windows 7 bug, see bug report #18574
  SetThreadLocale(GetUserDefaultLCID);
  InitInternationalGeneric;
  old8087CW:=Get8087CW;
  SysLocale.MBCS:=GetSystemMetrics(SM_DBCSENABLED)<>0;
  SysLocale.RightToLeft:=GetSystemMetrics(SM_MIDEASTENABLED)<>0;
  SysLocale.DefaultLCID := $0409;
  SysLocale.PriLangID := LANG_ENGLISH;
  SysLocale.SubLangID := SUBLANG_ENGLISH_US;
  // probably needs update with getthreadlocale. post 2.0.2

  DefaultCustomLocaleID := GetThreadLocale;
  if DefaultCustomLocaleID <> 0 then
    begin
      { Locale Identifiers
        +-------------+---------+-------------------------+
        |   Reserved  | Sort ID |      Language ID        |
        +-------------+---------+-------------------------+
        31         20 19      16 15                       0   bit }
      DefaultCustomLanguageID := DefaultCustomLocaleID and $FFFF; // 2^16
      if DefaultCustomLanguageID <> 0 then
        begin
          SysLocale.DefaultLCID := DefaultCustomLocaleID;
          { Language Identifiers
            +-------------------------+-------------------------+
            |     SubLanguage ID      |   Primary Language ID   |
            +-------------------------+-------------------------+
            15                      10  9                         0   bit  }
          SysLocale.PriLangID := DefaultCustomLanguageID and $3ff; // 2^10
          SysLocale.SubLangID := DefaultCustomLanguageID shr 10;
        end;
     end;

  Set8087CW(old8087CW);
  GetFormatSettings;
  if SysLocale.FarEast then GetEraNamesAndYearOffsets;
end;


mentre questa è quella di Linux:
Codice: [Seleziona]
Procedure InitInternational;
begin
  InitInternationalGeneric;
  InitAnsi;
end;
Dove non c'è la chiamata a GetlocaleFormatSettings.


Probabilmente, negli anni hanno cambiato questa implementazione, e la forzatura che facevo io ha smesso di funzionare.

Grazie ancora, Mario
Titolo: Re:Giorni della settimana in italiano
Inserito da: Legolas - Gennaio 13, 2013, 11:30:02 am
Per linux, prova ad includere la unit clocale. Dovrebbe inizializzare le impostazioni per la lingua di sistema:

http://lazarus-ccr.sourceforge.net/docs/rtl/clocale/index.html (http://lazarus-ccr.sourceforge.net/docs/rtl/clocale/index.html)
Titolo: Re:Giorni della settimana in italiano
Inserito da: bonmario - Gennaio 13, 2013, 11:53:42 am
Grazie,
stavo proprio per scrivere la stessa cosa !!!!
Ho provato a fare un po' di ricerche ed ho scoperto che basta aggiungere quella.

Casomai servisse a qualcun altro in futuro, visto che lo stesso progetto deve girare sia su Windows che su Linux, ho aggiunto questo nella uses:
Codice: [Seleziona]
{$IFDEF LINUX}
, clocale{$ENDIF}

Grazie a tutti, Mario
Titolo: Re:Giorni della settimana in italiano
Inserito da: Stilgar - Gennaio 13, 2013, 02:53:52 pm
Si Bonmario, intrendevo proprio modificare il valore delle stringhe ;)
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Gennaio 25, 2013, 01:25:57 pm
Ciao a tutti,
sfrutto questo vecchio thread, a cui ho cambiato il titolo, visto che la domanda è comunque attinente.
Voi avete già un metodo funzionante per fare in modo che quando emettete una MessageDlg, i tasti siano in italiano e non Yes, Cancel, ecc  in inglese?

Grazie, Mario
Titolo: Re:Traduzioni in italiano
Inserito da: Stilgar - Gennaio 25, 2013, 01:43:15 pm
http://wiki.freepascal.org/Translations_/_i18n_/_localizations_for_programs
Butta un'occhio ;)
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Febbraio 01, 2013, 07:41:59 pm
Scusa il ritardo, ma mi ero perso la tua risposta ...

C'è qualcosa che non mi torna ...
Ora sono a casa ed ho provato a lanciare questa istruzione su Linux:
Codice: [Seleziona]
  
  MessageDlg('Titolo', 'Msg', mtError, [mbYes, mbNo, mbOK, mbCancel, mbHelp, mbClose], 0);
i bottoni sono tutti in italiano.
Purtroppo qui non ho un'installazione Windows funzionante, ma sono quasi sicuro che la MessageDlg al lavoro, su windows, mi emette i bottoni in inglese.
Qualcuno può provare a dirmi se lanciando la stessa istruzione in windows escono in inglese?

Grazie, Mario
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Febbraio 04, 2013, 11:37:11 am
Sono appena riuscito a provarlo su Windows: il testo dei bottoni non è tradotto, ma resta quindi in inglese.

Ciao, Mario
Titolo: Re:Traduzioni in italiano
Inserito da: Stilgar - Febbraio 04, 2013, 04:10:59 pm
Versione di Windows ... lo so può sembrare una domanda idiota ;)
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Febbraio 04, 2013, 08:29:39 pm
Figurati, la domanda è sensatissima ... al lavoro ho Windows XP SP3. Appena ho un po' di tempo, provo ad installare Lazarus qui a casa sulla partizione con Win7 SP1 e vedo cosa mi fa.

Ciao, Mario
Titolo: Re:Traduzioni in italiano
Inserito da: Stilgar - Febbraio 05, 2013, 09:47:43 am
Scusami, intendevo dire se è la versione di Windows in Italiano o Inglese ... :( A volte mi esprimo da bestia.
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Febbraio 05, 2013, 01:24:52 pm
No, XP è in italiano ...

Ciao, Mario
Titolo: Re:Traduzioni in italiano
Inserito da: nomorelogic - Febbraio 05, 2013, 01:44:00 pm
mi torna in mente un problema che ho di tanto in tanto con windows e firebird nelle versioni di win in italiano.
in pratica nonostante la lingua e la localizzazione del formato data sono corrette (e corrette appaiono nel pannello di controllo), firebird, nei cast dei campi data mi da errore sul formato.
se uso invece la notazione anglosassone la cosa, inspiegabilmente, funziona nonostante la localizzazione sia italianissima.

dopo aver usurato diverse tastiere ho provato a fare la seguente operazione:

alla fine tutto appare esattamente come prima, però, almeno, firebird mi funziona!

prova a fare la stessa operazione
facci sapere
Titolo: Re:Traduzioni in italiano
Inserito da: Stilgar - Febbraio 05, 2013, 05:04:22 pm
ma firebird non impone il formato delle date scritte in una certa maniera?
Mi sembrava che ci fosse un "blocco".
Titolo: Re:Traduzioni in italiano
Inserito da: nomorelogic - Febbraio 05, 2013, 05:55:33 pm
infatti il problema non era sul server di firebird, solo alcuni client danno questo problema mentre altri no (e sono sempre tutti win italiani)
se non ricordo male l'eccezione ce l'avevo (sempre e solo su alcuni client) su Field.Value o qualcosa del genere
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Febbraio 05, 2013, 06:30:32 pm

alla fine tutto appare esattamente come prima, però, almeno, firebird mi funziona!

prova a fare la stessa operazione
facci sapere

Domani la provo al lavoro e ti faccio sapere. Mi hai fatto ricordare che ho avuto un problema analogo in Win7 sulla gestione delle data in Lazarus. Anche lì avevo cambiato la lingua e poi, tornando all'italiano, tutto funzionava correttamente.

Grazie ancora, Mario
Titolo: Re:Traduzioni in italiano
Inserito da: bonmario - Febbraio 06, 2013, 08:05:11 am
Niente da fare al lavoro cambiando la lingua e poi tornando all'italiano (Win XP) e niente da fare a casa su Win7, dopo aver installato Lazarus 1.0.6.

A questo punto, probabilmente la cosa è gestita in maniera differente tra Linux e Windows.

Ciao, Mario