Interessant, ich hätte mal angenommen Windows wäre der einfachere Teil ...
Es gibt noch andere Optionen unter Windows
https://learn.microsoft.com/de-de/wi...s-getgeoinfoex
https://learn.microsoft.com/de-de/wi...ls-getgeoinfow
https://learn.microsoft.com/de-de/wi...ed-apis-sample
Aber tatsächlich, eine eindeutige Lösung scheint es nicht zu geben.
Am Ende solllte es ein Fallback zu Deiner statischen Lösung geben, dann kannst Du auch direkt dabei bleiben.
Der einzige Vorteil der
OS Lösung wäre es, wenn sich mal Countries und -CountryCodes ändern,
dass dann das
OS immer aktuell bleibt und die statische Liste mal veraltet sein könnte.
Ich hoffe mal, dass es dazu nicht kommt
Delphi-Quellcode:
function GetCountryNameFromLocaleFallback(const Iso: string): string;
const
StaticLangs: array[0..6] of string = ('en', 'fr', 'es', 'de', 'pt', 'ar', 'ru');
var
UILang: array[0..LOCALE_NAME_MAX_LENGTH-1] of WideChar;
LangCode: string;
Candidate: string;
Buf: array[0..127] of WideChar;
Len: Integer;
begin
Result := '';
// 1) ISO-639-Sprache der UI holen
if GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT,
LOCALE_SISO639LANGNAME,
@UILang, LOCALE_NAME_MAX_LENGTH) > 0 then
LangCode := PChar(@UILang)
else
LangCode := 'en'; // Fallback
// 2) zuerst UI-Sprache testen
Candidate := LangCode + '-' + Iso;
Len := GetLocaleInfoEx(PChar(Candidate),
LOCALE_SLOCALIZEDCOUNTRYNAME,
@Buf, Length(Buf));
if Len > 0 then
Exit(Buf);
// 3) danach statische Sprachenliste
for LangCode in StaticLangs do
begin
Candidate := LangCode + '-' + Iso;
Len := GetLocaleInfoEx(PChar(Candidate),
LOCALE_SLOCALIZEDCOUNTRYNAME,
@Buf, Length(Buf));
if Len > 0 then
Exit(Buf);
end;
end;