Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#1

Windows Sprache ermitteln

  Alt 9. Jul 2008, 14:51
Hallo,
ich möchte gern in meiner Software Fehlermeldungen einbinden diese sollen jenachdem welche Sprache in Windows eingestellt ist
angezeigt werden. Z.b. wenn bei einem Datei öffnen versuch die Routine abbricht weil die Datei nicht gefunden werden kann soll
folgende Meldung erscheinen...

Deutsch: "Die Datei "test.txt" konnte nicht gefunden werden!"
Englisch: "File "test.txt" not found!"

So jetzt habe ich hier im Forum gesucht und habe auch etwas gefunden ich bin mir nur noch nicht ganz sicher ob das der richtige ansatzt ist.

Hier mal eine kleine Testanwendung für die unterschiedlichen Möglichkeiten.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bla:array[0..1023] of Char;

implementation

{$R *.dfm}

function GetLanguageNameByID(AID: Integer): WideString;
begin
  SetLength(Result,MAX_PATH);
  SetLength(Result, VerLanguageNameW(AID,@Result[1], length(Result)));
end;

function GetWindowsLanguage(LCTYPE: LCTYPE {type of information}): string;
var
  Buffer : PChar;
  Size : integer;
begin
  Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LCType, nil, 0);
  GetMem(Buffer, Size);
  try
    GetLocaleInfo (LOCALE_USER_DEFAULT, LCTYPE, Buffer, Size);
    Result := string(Buffer);
  finally
    FreeMem(Buffer);
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  LabeledEdit1.Text := GetLanguageNameByID(GetSystemDefaultLangID);   //Deutsch (Deutschland)
  LabeledEdit2.Text := GetLanguageNameByID(GetUserDefaultLangID);   //Englisch (USA)

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGCOUNTRY, @bla, sizeof(bla));
  Memo1.Lines.Add('Name des Landes (Englisch) : '+bla);         

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGLANGUAGE, @bla, sizeof(bla));
  Memo1.Lines.Add('Name der Sprache auf Englisch: '+bla);

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SLANGUAGE, @bla, sizeof(bla));
  Memo1.Lines.Add('Name der Sprache lokalisiert : '+bla);

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SNATIVELANGNAME, @bla, sizeof(bla));
  Memo1.Lines.Add('Orginalname der Sprache : '+bla);

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SNATIVECTRYNAME , @bla, sizeof(bla));
  Memo1.Lines.Add('Orginalname des Landes : '+bla);


  Memo1.Lines.Add('');
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_ILANGUAGE));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SLANGUAGE));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SENGLANGUAGE));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SABBREVLANGNAME));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SNATIVELANGNAME));

end;


end.
Jetzt habe ich mein "Deutsches" Windows XP in den Reginal Einstellungen auf Englisch umgestellt und erhalte, als Ergebnis folgendes.

Delphi-Quellcode:
LabeledEdit1.Text := GetLanguageNameByID(GetSystemDefaultLangID);   //Deutsch (Deutschland)
LabeledEdit2.Text := GetLanguageNameByID(GetUserDefaultLangID);   //Englisch (USA)
Im Memofeld erscheinen dann folgende Informationen...
Zitat:
Name des Landes (Englisch) : Germany
Name der Sprache auf Englisch: German
Name der Sprache lokalisiert : Deutsch (Deutschland)
Orginalname der Sprache : Deutsch
Orginalname des Landes : Deutschland

0409
Englisch (USA)
English
ENU
English

Wenn ich die System Sprache abfrage ist klar das die Sprache angezeigt wird in der das Windows Installiert wird auch wenn
die Sprache umgestellt ist, oder aber ich zeige die Meldungen in der Sprache an die der Benutzer eingestellt hat. Dies
muß ich für mich entscheiden was mir sinnvoller erscheint.

Ein Problem ist aber noch wie Frage ich auf "Deutsch" oder "Englisch" ab, wenn es eine andere Länderinstalltion ist Beisp.
"Deutsch (Schweiz)" oder "English (Great Briten)" usw.

Ich könnte mir das so vorstellen, ob das aber so vernünftig funktioniert...
Delphi-Quellcode:
GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGLANGUAGE, @bla, sizeof(bla));
if bla = 'Deutschthen
  ShowMessage('Datei "test.txt" konnte nicht gefunden werden');

if bla = 'Englishthen
  ShowMessage('File not found!');

So Richtig zufrieden bin ich da irgendwie nicht mit, ob ich das jetzt alles so richtig habe oder es da noch ein anderer Ansatz vorhanden ist.
  Mit Zitat antworten Zitat