You should use GetSystemLayoutList function to get identifiers of all system languages and use VerLanguagename function to convert these IDs to locales.
procedure TForm1.Button1Click(Sender: TObject); var Count, i: Integer; MyLang: PChar; Layouts: array [0..16] of Integer; const Size: Integer = 250; begin GetMem(MyLang, Size); Count:=GetKeyboardLayoutList(16, Layouts); Memo1.Lines.Clear; for i:=0 to Count-1 do begin VerLanguageName(Layouts[i], MyLang, Size); Memo1.Lines.Add(StrPas(MyLang)); end; FreeMem(MyLang); end;