Mögliche Probleme mit GetUserDefaultLangID() ?
-
Hallo Community,
ich möchte erreichen, dass meine Anwendung beim Start prüft, welche Betriebssystemsprache aktuell eingestellt ist. Dies erreiche ich mit PRIMARYLANGID(GetUserDefaultLangID()). Dann wird für alle deutschsprachigen Betriebssysteme die deutschsprachige Version meines Programms angezeigt, ansonsten immer die englischsprachige Version...
nun lese ich aber im MSDN unter PRIMARYLANGID folgendes:
LANGIDs have some unusual quirks that can cause trouble. Its generally best to avoid language specific assumptions. If absolutely necessary, consider using resource loading to load appropriate resources, or use that locale name (ie: en-US) or rfc GetLocaleInfoEx() properties to provide information
Heißt das, mein Vorgehen ist schlecht um die aktuelle Anzeigesprache des Betriebssystems zu ermitteln? Ich will nur beim Start automatisch zw. Deutsch und Englisch wählen lassen.
Außerdem verunsichert mich dieser Satz aus dem MSDN zur Beschreibung der Funktion GetUserDefaultLangID():
Remarks
The return value is not necessarily the same as that returned by GetSystemDefaultLangID, even for a single-user computer.Bedeutet das nur, dass bei einem Betriebssystem das für mehrere Benutzer eingerichtet ist, sich die Werte von UserDefaultLang und SystemDefaultLang unterscheiden können? Spielt das für meinen Fall eine Rolle?
Für ein paar klare Worte zu diesem Thema wäre ich sehr Dankbar!
-
Ich würde sagen, es spricht nichts gegen deine Vorgehensweise .. bei Deutsch und Englisch wird es mit Sicherheit keine Probleme geben .. sind ja nicht die hinterletzten kuhdorfsprachen .. u know .. zum zweiten Zitat ... Da lese ich raus, dass die beiden Funktionen halt nicht immer die gleichen IDs für die gleiche Sprache rausgeben, es also für die beiden Funktionen unterschiedliche ID-Tables gibt/geben muss/geben sollte. Wenn du nur mit einer der beiden Funktionen arbeitest und die richtige Tabelle für die benutzte Funktion nimmst, gibt es keine Komplikationen.
EDIT: Btw. solltest du aber auch deutschen Usern die Möglichkeit geben, dein Programm in englischer Sprache zu benutzen. Es ist besser den Benutzer wählen zu lassen, als ihm die vermeintlich bevorzugte Sprache aufzuzwingen.
-
Windows unterscheidet zwischen der Standardsprache des Systems sowie zwischen der eingestellten Sprache für den Anwender. Es ist durchaus möglich, dass das System auf Deutsch eingestellt ist und ein Anwender aber lieber mit englischer UI arbeitet. In diesem Fall geben GetSystemDefaultLangID und GetUserDefaultLangID unterschiedliche Werte zurück (1031 und 1033).
-
dust schrieb:
EDIT: Btw. solltest du aber auch deutschen Usern die Möglichkeit geben, dein Programm in englischer Sprache zu benutzen. Es ist besser den Benutzer wählen zu lassen, als ihm die vermeintlich bevorzugte Sprache aufzuzwingen.
Ja du hast völlig recht, das habe ich bereits implementiert. Ich möchte nur zusätzlich etwas Komfort reinbringen, indem ich je nach aktuell benutzter Sprache auch mein Programm erstmal in dieser Sprache anzeigen lasse.
sri schrieb:
Windows unterscheidet zwischen der Standardsprache des Systems sowie zwischen der eingestellten Sprache für den Anwender. Es ist durchaus möglich, dass das System auf Deutsch eingestellt ist und ein Anwender aber lieber mit englischer UI arbeitet. In diesem Fall geben GetSystemDefaultLangID und GetUserDefaultLangID unterschiedliche Werte zurück (1031 und 1033).
Ok, also wird für beide Werte dieselbe Tabelle genutzt, aber es können für die jeweiligen Werte (User/System) verschiedene Tabellenwerte hinterlegt sein. Dann sollte es keine Probleme geben, da ich immer auf die Spracheinstellung des aktuellen Benutzers abfrage.
-
Schau einfach in die MFC wie die das macht in AfxLoadLangResourceDLL.
In folgenden Schritten kann man die nächstliegende existierende Sprache suchen.
- Zuerst kontrollieren ob es die Funktion GetUserDefaultUILanguage gibt wenn ja diese Sprache nehmen. (ab ME, W2K, XP)
- Dann kontrollieren ob es die Funktion GetSystemDefaultUILanguage gibt, wenn ja diese Sprache verwenden. (ab ME, W2K, XP)
- Ist weder die eine noch die andere Funktion vorhanden kann man die Sprachversion der Ressource 1 in der ntdll.dll ermitteln und diese verwenden.
- Siehe auch ConvertDefaultLocale mit den entsprechenden IDs
LOCALE_SYSTEM_DEFAULT
LOCALE_USER_DEFAULT
ab Vista:
LOCALE_CUSTOM_DEFAULT
LOCALE_CUSTOM_UI_DEFAULT
-
@Martin Richter: Ich möchte einfach nur meine eigenen Programmtexte (Captions etc) englisch darstellen, wenn die primäre Sprach-ID nicht auf eine deutsche Sprache hinweist. Das funktioniert auch.
Was du mir mit deinem Post sagen willst, ist bei mir leider nicht ganz angekommen.Martin Richter schrieb:
In folgenden Schritten kann man die nächstliegende existierende Sprache suchen. ...
Das möchte ich doch garnicht.
-
Ich wollte Dir nur die verschiedenen Schritte zeigen in denen eine Sprachinfo steckt. Das hängt eben leider vom OS ab.
Seit dem es MUI Systeme gibt is ales einfacher und zugleich komplexer geworden.
-
War zu schnell:
Der folgende Code liefert zuverlässig die aktuele OS Sprache (auch bei MUI Systemen).
typedef LANGID (WINAPI*PFNGETUSERDEFAULTUILANGUAGE)(); LANGID GetCurrentSystemLanguage() { LCID lcid = MAKELCID(LANG_USER_DEFAULT,SORT_DEFAULT); // Is this a MUI capable system? HINSTANCE hKernel32 = ::GetModuleHandle(_T("kernel32.dll")); ASSERT(hKernel32 != NULL); PFNGETUSERDEFAULTUILANGUAGE pfnGetUserDefaultUILanguage; pfnGetUserDefaultUILanguage = (PFNGETUSERDEFAULTUILANGUAGE)::GetProcAddress(hKernel32, "GetUserDefaultUILanguage"); if (pfnGetUserDefaultUILanguage) { // First, try the user's UI language from MUI capable system LANGID langid = pfnGetUserDefaultUILanguage(); WORD nPrimaryLang = PRIMARYLANGID(langid); WORD nSubLang = SUBLANGID(langid); lcid = MAKELCID(MAKELANGID(nPrimaryLang, nSubLang), SORT_DEFAULT); } // Get the real one lcid = ::ConvertDefaultLocale(lcid); return PRIMARYLANGID(LANGIDFROMLCID(lcid)); }