DateTimePicker Lokalisierung

Rund um die LCL und andere Komponenten
Antworten
oleg
Beiträge: 28
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

DateTimePicker Lokalisierung

Beitrag von oleg »

ich habe aktuell in einem großem Projekt ein Lokalisierungs Problem. das Projekt ist in Englisch und Deutsch. Lokalisiert mit *.po Dateien und

Code: Alles auswählen

TranslateUnitResourceStrings('lr_const',poDirectory + 'lr_const.' + AppConfig.rSprache + '.po');
Einige Benutzer lokalisieren ihren PC mit dem amerkanischen Datumsformat. Ich musste nun von Hand den Datumsseperator verbiegen, damit die Abfrage am MySQL Server korrekt laufen.

Code: Alles auswählen

DateSeparator   := '.';
ShortDateFormat := 'dd.mm.yyyy';
Im Hauptprogramm (Formular) werden die DateTimePicker jetzt blöderweise im Format SQL-Filter: 11/1/2022 | 11/30/2022 angezeigt. Die MySQL Ausführung ist korrekt, es geht nur um die optische Darstellung. In externen Formularen ist die Anzeige des DateTimePickers korrekt im Format z.B. 22.10.2022.
Im Hauptprogramm gelingt es mir nicht die Anzeige des Datums korrekt zu formatieren (lokalisieren also mit de/en zu übersetzen).

Code: Alles auswählen

  var iKW : Integer;
 begin
 dt_UserDateTime := Now();
   iKW := WeekOfTheYear(dt_UserDateTime); 
     case AppConfig.rViewDateTime of
     // 0 : ; // OFF;
      ....
         4 : Label_UserDateTime.Caption := FormatDateTime('dddd, dd.mm.yyyy (KW ' + IntToStr(iKW) + ') - hh:mm',dt_UserDateTime);
      ....
      else
       begin
        // Ausgabe deaktiviert
       end;
    end;                      
Vielleicht habe ich auch den falschen Ansatz. Würde mich freuen wenn ich hier Unterstützung bekommen würde.

oleg
Beiträge: 28
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: DateTimePicker Lokalisierung

Beitrag von oleg »

Teillösung Lokalisierung
Die Übersetzung des Datums wurde gelöst. Es wird jetzt immer die Sprache der Programmeinstellung gewertet, unabhängig was im Betriebssystem eingestellt ist.

Code: Alles auswählen

          case AppConfig.rSprache of
            'de'   : GetLocaleFormatSettings(MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), formatSettings);
            'en'   : GetLocaleFormatSettings(MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), formatSettings);
            'pl'   : GetLocaleFormatSettings(MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT), formatSettings);
           else
            GetLocaleFormatSettings(MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), formatSettings);;
          end;
             DateSeparator   := '.';
             ShortDateFormat := 'dd.mm.yyyy';
Rätselhaft bleibt das Verhalten des DateTimePickers im Hauptprogramm "fehlerhaft" in Unterfenstern korrekt
DateTimePicker.jpg
DateTimePicker.jpg (10.22 KiB) 698 mal betrachtet
Selbst nachfolgender Code bringt kein Erfolg

Code: Alles auswählen

DateTimePicker1.UseDefaultSeparators := False;
DateTimePicker2.UseDefaultSeparators := False;

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: DateTimePicker Lokalisierung

Beitrag von wp_xyz »

Ich bin nicht sicher, ob ich genau verstehe, was du machst. Daher habe ich eine kleine Testanwendung geschrieben, mit DateTimePicker, bei der die Sprache zwischen deutsch und englisch umgeschaltet werden kann - siehe Anhang.

Die FormatSettings könnte man unter Windows auch durch Systemabfragen herausbekommen (GetLocaleFormatSettings) - aber eben nur unter Windows. Linux hat sowas meines Wissens nicht, und damit wäre ein großer Vorteil von Lazarus, die Plattformunabhängigkeit, dahin. Man könnte die FormatSettings für alle in Frage kommenden Länder natürlich auch in eine eigene Unit packen, damit könnte man sich die Tipparbeit fürs nächste Mal ersparen...
Dateianhänge
datetimepicker_format.zip
(24.63 KiB) 38-mal heruntergeladen

oleg
Beiträge: 28
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: DateTimePicker Lokalisierung

Beitrag von oleg »

Vielen Dank, dass du dir die Mühe gemacht hast. Dein Versuchsprojekt spiegelt zu 100% mein Anliegen dar und funktioniert genau so wie erwartet.

Ich versuche nochmal genauer zu erklären, was ich möchte.
Ich möchte die Darstellung der DateTimePicker in der Einstellung "Deutsch" belassen unabhängig davon, welches Format eingestellt ist. Also auch im Englischen wo im Format der "/" als Trennzeichen gilt.

Es sieht ziemlich doof aus, wenn in einem aufgerufenem Fenster die DateTimePicker im deutschen Format angezeigt werden - im Hauptfenster jedoch im englischen Format.

Die GetLocaleFormatSettings hatte ich schon gefunden.

oleg
Beiträge: 28
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: DateTimePicker Lokalisierung

Beitrag von oleg »

Code: Alles auswählen

const
  Fmt = 'dd.mm.yyyy';
 var
   Y,M : Word;
begin  
// diese beiden Zeilen aus deinem Project gefunden
 DateTimePicker1.DateSeparator := '.';
 DateTimePicker1.DateDisplayOrder := ddoMDY;  // <- das funktioniert noch nicht ???   
 DateTimePicker2.DateSeparator := '.';
 DateTimePicker2.DateDisplayOrder := ddoDMY;      
....
    // Datum - erster - letzter Tag des Monats
     Y:=YearOf(Today);
     M:=MonthOf(Today);
     DateTimePicker1.Date := StrToDateTime(FormatDateTime(Fmt,StartOfAMonth(Y,M)));
     DateTimePicker2.Date := StrToDateTime(FormatDateTime(Fmt,EndOfAMonth(Y,M)));       
DateTimePicker_2.jpg
DateTimePicker_2.jpg (10.07 KiB) 656 mal betrachtet

oleg
Beiträge: 28
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: DateTimePicker Lokalisierung

Beitrag von oleg »

oleg hat geschrieben:
Sa 12. Nov 2022, 15:34

Code: Alles auswählen

// diese beiden Zeilen aus deinem Project gefunden
 DateTimePicker1.DateSeparator := '.';
 DateTimePicker1.DateDisplayOrder := ddoMDY;  // <- das funktioniert noch nicht ??? 
 DateTimePicker2.DateSeparator := '.';
 DateTimePicker2.DateDisplayOrder := ddoDMY;      
Sorry. mein Fehler. Wenigstens abschreiben muss man können. :)
Merke: ddoMDY <> ddoDMY

Problem gelöst: Vielen Dank an alle.

Antworten