![]() |
Windows Sprache ermitteln
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:
Jetzt habe ich mein "Deutsches" Windows XP in den Reginal Einstellungen auf Englisch umgestellt und erhalte, als Ergebnis folgendes.
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.
Delphi-Quellcode:
Im Memofeld erscheinen dann folgende Informationen...
LabeledEdit1.Text := GetLanguageNameByID(GetSystemDefaultLangID); //Deutsch (Deutschland)
LabeledEdit2.Text := GetLanguageNameByID(GetUserDefaultLangID); //Englisch (USA) Zitat:
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 = 'Deutsch' then ShowMessage('Datei "test.txt" konnte nicht gefunden werden'); if bla = 'English' then 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. |
Re: Windows Sprache ermitteln
Zitat:
|
Re: Windows Sprache ermitteln
Das will ich ja grade nicht, ich will sicher sein das ich eine Abfrage habe die auf die ganze "Familie" abfragt egal ob das
ein Österreichisches oder ein Windows aus Lichtenstein ist. Ich habe jetzt eine Abfrage genommen die mit 'LOCALE_SNATIVELANGNAME' arbeitet.
Delphi-Quellcode:
Ich war mir halt nur nicht sicher ob das alles so klappt weil es ja die unterschiedlichen Ländern mit der gleichen Sprache gibt.
if AnsiLowerCase(GetWindowsLanguage(LOCALE_SNATIVELANGNAME)) = 'deutsch' then ...
z.B. die Abkürzungen 'LOCALE_SABBREVLANGNAME' bringen mir nichts da "Niederländisch (Niederlande)" mit NLD und "Niederländisch (Belgien)" mit NLB abgekürzt wird. |
Re: Windows Sprache ermitteln
GetKeyboardLayout:
Man kann noch GetKeyboardLayout abfragen, dann hast Du das gesuchte Land. oder so:
Delphi-Quellcode:
const
IDAfrikaans = $0436; IDAlbanian = $041C; IDArabicAlgeria = $1401; IDArabicBahrain = $3C01; IDArabicEgypt = $0C01; IDArabicIraq = $0801; IDArabicJordan = $2C01; IDArabicKuwait = $3401; IDArabicLebanon = $3001; IDArabicLibya = $1001; IDArabicMorocco = $1801; IDArabicOman = $2001; IDArabicQatar = $4001; IDArabic = $0401; IDArabicSyria = $2801; IDArabicTunisia = $1C01; IDArabicUAE = $3801; IDArabicYemen = $2401; IDArmenian = $042B; IDAssamese = $044D; IDAzeriCyrillic = $082C; IDAzeriLatin = $042C; IDBasque = $042D; IDByelorussian = $0423; IDBengali = $0445; IDBulgarian = $0402; IDBurmese = $0455; IDCatalan = $0403; IDChineseHongKong = $0C04; IDChineseMacao = $1404; IDSimplifiedChinese = $0804; IDChineseSingapore = $1004; IDTraditionalChinese = $0404; IDCroatian = $041A; IDCzech = $0405; IDDanish = $0406; IDBelgianDutch = $0813; IDDutch = $0413; IDEnglishAUS = $0C09; IDEnglishBelize = $2809; IDEnglishCanadian = $1009; IDEnglishCaribbean = $2409; IDEnglishIreland = $1809; IDEnglishJamaica = $2009; IDEnglishNewZealand = $1409; IDEnglishPhilippines = $3409; IDEnglishSouthAfrica = $1C09; IDEnglishTrinidad = $2C09; IDEnglishUK = $0809; IDEnglishUS = $0409; IDEnglishZimbabwe = $3009; IDEstonian = $0425; IDFaeroese = $0438; IDFarsi = $0429; IDFinnish = $040B; IDBelgianFrench = $080C; IDFrenchCameroon = $2C0C; IDFrenchCanadian = $0C0C; IDFrenchCotedIvoire = $300C; IDFrench = $040C; IDFrenchLuxembourg = $140C; IDFrenchMali = $340C; IDFrenchMonaco = $180C; IDFrenchReunion = $200C; IDFrenchSenegal = $280C; IDSwissFrench = $100C; IDFrenchWestIndies = $1C0C; IDFrenchZaire = $240C; IDFrisianNetherlands = $0462; IDGaelicIreland = $083C; IDGaelicScotland = $043C; IDGalician = $0456; IDGeorgian = $0437; IDGermanAustria = $0C07; IDGerman = $0407; IDGermanLiechtenstein = $1407; IDGermanLuxembourg = $1007; IDSwissGerman = $0807; IDGreek = $0408; IDGujarati = $0447; IDHebrew = $040D; IDHindi = $0439; IDHungarian = $040E; IDIcelandic = $040F; IDIndonesian = $0421; IDItalian = $0410; IDSwissItalian = $0810; IDJapanese = $0411; IDKannada = $044B; IDKashmiri = $0460; IDKazakh = $043F; IDKhmer = $0453; IDKirghiz = $0440; IDKonkani = $0457; IDKorean = $0412; IDLao = $0454; IDLatvian = $0426; IDLithuanian = $0427; IDMacedonian = $042F; IDMalaysian = $043E; IDMalayBruneiDarussalam = $083E; IDMalayalam = $044C; IDMaltese = $043A; IDManipuri = $0458; IDMarathi = $044E; IDMongolian = $0450; IDNepali = $0461; IDNorwegianBokmol = $0414; IDNorwegianNynorsk = $0814; IDOriya = $0448; IDPolish = $0415; IDBrazilianPortuguese = $0416; IDPortuguese = $0816; IDPunjabi = $0446; IDRhaetoRomanic = $0417; IDRomanianMoldova = $0818; IDRomanian = $0418; IDRussianMoldova = $0819; IDRussian = $0419; IDSamiLappish = $043B; IDSanskrit = $044F; IDSerbianCyrillic = $0C1A; IDSerbianLatin = $081A; IDSesotho = $0430; IDSindhi = $0459; IDSlovak = $041B; IDSlovenian = $0424; IDSorbian = $042E; IDSpanishArgentina = $2C0A; IDSpanishBolivia = $400A; IDSpanishChile = $340A; IDSpanishColombia = $240A; IDSpanishCostaRica = $140A; IDSpanishDominicanRepublic = $1C0A; IDSpanishEcuador = $300A; IDSpanishElSalvador = $440A; IDSpanishGuatemala = $100A; IDSpanishHonduras = $480A; IDMexicanSpanish = $080A; IDSpanishNicaragua = $4C0A; IDSpanishPanama = $180A; IDSpanishParaguay = $3C0A; IDSpanishPeru = $280A; IDSpanishPuertoRico = $500A; IDSpanishModernSort = $0C0A; IDSpanish = $040A; IDSpanishUruguay = $380A; IDSpanishVenezuela = $200A; IDSutu = $0430; IDSwahili = $0441; IDSwedishFinland = $081D; IDSwedish = $041D; IDTajik = $0428; IDTamil = $0449; IDTatar = $0444; IDTelugu = $044A; IDThai = $041E; IDTibetan = $0451; IDTsonga = $0431; IDTswana = $0432; IDTurkish = $041F; IDTurkmen = $0442; IDUkrainian = $0422; IDUrdu = $0420; IDUzbekCyrillic = $0843; IDUzbekLatin = $0443; IDVenda = $0433; IDVietnamese = $042A; IDWelsh = $0452; IDXhosa = $0434; IDZulu = $0435; function GetWindowsLanguage: string; var langid: Cardinal; langcode: string; CountryName: array[0..4] of char; LanguageName: array[0..4] of char; works: boolean; begin // The return value of GetLocaleInfo is compared with 3 = 2 characters and a zero works := 3 = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, LanguageName, SizeOf(LanguageName)); works := works and (3 = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, CountryName, SizeOf(CountryName))); if works then begin // Windows 98, Me, NT4, 2000, XP and newer LangCode := PChar(@LanguageName[0]); if lowercase(LangCode)='no' then LangCode:='nb'; LangCode:=LangCode + '_' + PChar(@CountryName[0]); end else begin // This part should only happen on Windows 95. langid := GetThreadLocale; case langid of IDBelgianDutch: langcode := 'nl_BE'; IDBelgianFrench: langcode := 'fr_BE'; IDBrazilianPortuguese: langcode := 'pt_BR'; IDDanish: langcode := 'da_DK'; IDDutch: langcode := 'nl_NL'; IDEnglishUK: langcode := 'en_GB'; IDEnglishUS: langcode := 'en_US'; IDFinnish: langcode := 'fi_FI'; IDFrench: langcode := 'fr_FR'; IDFrenchCanadian: langcode := 'fr_CA'; IDGerman: langcode := 'de_DE'; IDGermanLuxembourg: langcode := 'de_LU'; IDGreek: langcode := 'el_GR'; IDIcelandic: langcode := 'is_IS'; IDItalian: langcode := 'it_IT'; IDKorean: langcode := 'ko_KO'; IDNorwegianBokmol: langcode := 'nb_NO'; IDNorwegianNynorsk: langcode := 'nn_NO'; IDPolish: langcode := 'pl_PL'; IDPortuguese: langcode := 'pt_PT'; IDRussian: langcode := 'ru_RU'; IDSpanish, IDSpanishModernSort: langcode := 'es_ES'; IDSwedish: langcode := 'sv_SE'; IDSwedishFinland: langcode := 'sv_FI'; else langcode := 'C'; end; end; Result := langcode; end; |
Re: Windows Sprache ermitteln
Auch mit "GetKeyBoardLayout" wird es nicht gehen, ich habe jetzt den Test mit Vista Ultimate gemacht, dort läßt sich
die Sprache ja "komplett" umstellen. Rufe ich jetzt meine Testanwendung auf, wenn ich Vista auf Englisch umstelle, so zeigt mir die Anwendung als Sprache "Deutsch" an was ja korrekt ist, weil die Regional Einstellungen sind ja auch alle auf Deutsch. Ich brauche aber die Sprache in der das Betriebssystem arbeitet. Wenn man z.B. mit Application.MessageBox() einen Dialog anzeigen läßt so werden die Buttons ja auch in der jeweiligen Sprache eingestellt (Beisp. "Ja/Nein" bzw. "Yes/No") und genau sowas will ich für meine eigenen Dialoge auch haben. Nur wie bekomme ich herraus in welcher Sprache das Windows vorliegt. Ich hätte gern unabhängig von den Regional Einstellungen die eingestellte Sprache. |
Re: Windows Sprache ermitteln
Guck noch mal auf meinen Beitrag...
|
Re: Windows Sprache ermitteln
Ich würde es versuchen mit:
LOCALE_SISO639LANGNAME - 'ISO abbreviated language name ![]() ![]() LOCALE_SISO3166CTRYNAME - 'ISO abbreviated country name ![]() ![]() So wie es auch hathor von gnugettext übernommen hat. Nachtrag: Zitat:
|
Re: Windows Sprache ermitteln
Zitat:
|
Re: Windows Sprache ermitteln
Warum nimmst Du nicht fertige Sachen dafür?
z.B. Multilizer oder Gnu Gettext? Da macht die Komponente die Spracherkennung. |
Re: Windows Sprache ermitteln
Ich denke, Lokalisierung macht man am besten mit Ressourcen. LoadString lädt immer den String in der System-Sprache (wobei ich nicht weiß, ob das die Installationssprache ist oder die der Regionaleinstellungen), sofern er vorliegt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz