From 20efb43a8645cbca235d0b920e7cd0b0d6a9b576 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Fri, 28 Oct 2005 07:14:53 +0000 Subject: [PATCH] add ArchHooks::GetPreferredLanguage --- stepmania/src/arch/ArchHooks/ArchHooks.h | 6 ++ .../src/arch/ArchHooks/ArchHooks_Win32.cpp | 92 +++++++++++++++++++ .../src/arch/ArchHooks/ArchHooks_Win32.h | 1 + 3 files changed, 99 insertions(+) diff --git a/stepmania/src/arch/ArchHooks/ArchHooks.h b/stepmania/src/arch/ArchHooks/ArchHooks.h index 5cfe4ee014..f63d0ad311 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks.h +++ b/stepmania/src/arch/ArchHooks/ArchHooks.h @@ -15,6 +15,12 @@ public: /* Re-exec the game. If this is implemented, it doesn't return. */ virtual void RestartProgram() { } + /* + * Get the 2-letter RFC-639 code of the user's preferred language + * for localized messages, in uppercase. + */ + virtual CString GetPreferredLanguage() { return "EN"; } + /* Call this to temporarily enter a high-priority or realtime scheduling (depending * on the implementation) mode. This is used to improve timestamp accuracy. Do as * little as possible in this mode; hanging in it might hang the system entirely. */ diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp index b9ddbb676f..2baf45c5f7 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp @@ -159,6 +159,98 @@ void ArchHooks_Win32::RestartProgram() Win32RestartProgram(); } +static CString LangIdToString( LANGID l ) +{ + switch( PRIMARYLANGID(l) ) + { + case LANG_ARABIC: return "AR"; + case LANG_BULGARIAN: return "BG"; + case LANG_CATALAN: return "CA"; + case LANG_CHINESE: return "ZH"; + case LANG_CZECH: return "CS"; + case LANG_DANISH: return "DA"; + case LANG_GERMAN: return "DE"; + case LANG_GREEK: return "EL"; + case LANG_SPANISH: return "ES"; + case LANG_FINNISH: return "FI"; + case LANG_FRENCH: return "FR"; + case LANG_HEBREW: return "IW"; + case LANG_HUNGARIAN: return "HU"; + case LANG_ICELANDIC: return "IS"; + case LANG_ITALIAN: return "IT"; + case LANG_JAPANESE: return "JA"; + case LANG_KOREAN: return "KO"; + case LANG_DUTCH: return "NL"; + case LANG_NORWEGIAN: return "NO"; + case LANG_POLISH: return "PL"; + case LANG_PORTUGUESE: return "PT"; + case LANG_ROMANIAN: return "RO"; + case LANG_RUSSIAN: return "RU"; + case LANG_CROATIAN: return "HR"; + // case LANG_SERBIAN: return "SR"; // same as LANG_CROATIAN? + case LANG_SLOVAK: return "SK"; + case LANG_ALBANIAN: return "SQ"; + case LANG_SWEDISH: return "SV"; + case LANG_THAI: return "TH"; + case LANG_TURKISH: return "TR"; + case LANG_URDU: return "UR"; + case LANG_INDONESIAN: return "IN"; + case LANG_UKRAINIAN: return "UK"; + case LANG_SLOVENIAN: return "SL"; + case LANG_ESTONIAN: return "ET"; + case LANG_LATVIAN: return "LV"; + case LANG_LITHUANIAN: return "LT"; + case LANG_VIETNAMESE: return "VI"; + case LANG_ARMENIAN: return "HY"; + case LANG_BASQUE: return "EU"; + case LANG_MACEDONIAN: return "MK"; + case LANG_AFRIKAANS: return "AF"; + case LANG_GEORGIAN: return "KA"; + case LANG_FAEROESE: return "FO"; + case LANG_HINDI: return "HI"; + case LANG_MALAY: return "MS"; + case LANG_KAZAK: return "KK"; + case LANG_SWAHILI: return "SW"; + case LANG_UZBEK: return "UZ"; + case LANG_TATAR: return "TT"; + case LANG_PUNJABI: return "PA"; + case LANG_GUJARATI: return "GU"; + case LANG_TAMIL: return "TA"; + case LANG_KANNADA: return "KN"; + case LANG_MARATHI: return "MR"; + case LANG_SANSKRIT: return "SA"; + case LANG_MONGOLIAN: return "MN"; + case LANG_GALICIAN: return "GL"; + default: + case LANG_ENGLISH: return "EN"; + } +} + +static LANGID GetLanguageID() +{ + HINSTANCE hDLL = LoadLibrary( "kernel32.dll" ); + if( hDLL ) + { + typedef LANGID(GET_USER_DEFAULT_UI_LANGUAGE)(void); + + GET_USER_DEFAULT_UI_LANGUAGE *pGetUserDefaultUILanguage = (GET_USER_DEFAULT_UI_LANGUAGE*) GetProcAddress( hDLL, "GetUserDefaultUILanguage" ); + if( pGetUserDefaultUILanguage ) + { + LANGID ret = pGetUserDefaultUILanguage(); + FreeLibrary( hDLL ); + return ret; + } + FreeLibrary( hDLL ); + } + + return GetSystemDefaultLangID(); +} + +CString ArchHooks_Win32::GetPreferredLanguage() +{ + return LangIdToString( GetLanguageID() ); +} + void ArchHooks_Win32::EnterTimeCriticalSection() { TimeCritMutex->Lock(); diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.h b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.h index a3f1b1db17..e90873c4dc 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.h +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.h @@ -11,6 +11,7 @@ public: ~ArchHooks_Win32(); void DumpDebugInfo(); void RestartProgram(); + CString GetPreferredLanguage(); int OldThreadPriority; RageMutex *TimeCritMutex;