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):
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
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
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
DefaultFormatSettings.LongDayNames[DayOfWeek(WrkData)]
Ciao, Mario
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:
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:
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
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:
{$IFDEF LINUX}
, clocale{$ENDIF}
Grazie a tutti, Mario
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:
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