diff --git a/stepmania/src/arch/ArchHooks/ArchHooks.h b/stepmania/src/arch/ArchHooks/ArchHooks.h index 9ccb0cb872..b574fc8054 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks.h +++ b/stepmania/src/arch/ArchHooks/ArchHooks.h @@ -19,7 +19,7 @@ public: * Get the 2-letter RFC-639 code of the user's preferred language * for localized messages, in uppercase. */ - virtual CString GetPreferredLanguage() { return "EN"; } + static RString GetPreferredLanguage(); /* * If this is a second instance, return true. Optionally, give focus to the existing @@ -88,7 +88,7 @@ public: /* * Add file search paths, higher priority first. */ - static void MountInitialFilesystems( const CString &sDirOfExecutable ); + static void MountInitialFilesystems( const RString &sDirOfExecutable ); private: /* This are helpers for GetMicrosecondsSinceStart on systems with a timer diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp index d9544a1975..4febf5a8cd 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.cpp @@ -190,99 +190,6 @@ 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"; - // These aren't present in the VC6 headers. We'll never have translations to these languages anyway. -C - //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 GetUserDefaultLangID(); -} - -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 e10fe13780..e06fa5556f 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Win32.h +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Win32.h @@ -11,7 +11,6 @@ public: ~ArchHooks_Win32(); void DumpDebugInfo(); void RestartProgram(); - CString GetPreferredLanguage(); bool CheckForMultipleInstances(); int OldThreadPriority; diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp index 37d5c8f288..d13794be8e 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp @@ -39,19 +39,19 @@ int64_t ArchHooks::GetMicrosecondsSinceStart( bool bAccurate ) return ret; } -void ArchHooks::MountInitialFilesystems( const CString &sDirOfExecutable ) +void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) { /* All Windows data goes in the directory one level above the executable. */ CHECKPOINT_M( ssprintf( "DOE \"%s\"", sDirOfExecutable.c_str()) ); - vector parts; + vector parts; split( sDirOfExecutable, "/", parts ); CHECKPOINT_M( ssprintf( "... %i parts", parts.size()) ); ASSERT_M( parts.size() > 1, ssprintf("Strange sDirOfExecutable: %s", sDirOfExecutable.c_str()) ); - CString Dir = join( "/", parts.begin(), parts.end()-1 ); + RString Dir = join( "/", parts.begin(), parts.end()-1 ); FILEMAN->Mount( "dir", Dir, "/" ); - CString sMyDocumentsDir = GetMyDocumentsDir(); - CString sApplicationDataDir = GetApplicationDataDir(); + RString sMyDocumentsDir = GetMyDocumentsDir(); + RString sApplicationDataDir = GetApplicationDataDir(); // Mount everything game-writable (not counting the editor) to the user's directory. FILEMAN->Mount( "dir", sApplicationDataDir + PRODUCT_ID + "/Cache", "/Cache" ); @@ -59,6 +59,99 @@ void ArchHooks::MountInitialFilesystems( const CString &sDirOfExecutable ) FILEMAN->Mount( "dir", sMyDocumentsDir + PRODUCT_ID + "/Screenshots", "/Screenshots" ); } +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"; + // These aren't present in the VC6 headers. We'll never have translations to these languages anyway. -C + //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 GetUserDefaultLangID(); +} + +RString ArchHooks::GetPreferredLanguage() +{ + return LangIdToString( GetLanguageID() ); +} + /* * (c) 2003-2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_darwin.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_darwin.cpp index ff4f429995..47960c8403 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_darwin.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_darwin.cpp @@ -215,7 +215,7 @@ extern "C" extern char *GetPreferredLanguage(); } -CString ArchHooks_darwin::GetPreferredLanguage() +RString ArchHooks::GetPreferredLanguage() { char *lang = ::GetPreferredLanguage(); CString ret = lang; diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_darwin.h b/stepmania/src/arch/ArchHooks/ArchHooks_darwin.h index 03622aedc9..19e41527e3 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_darwin.h +++ b/stepmania/src/arch/ArchHooks/ArchHooks_darwin.h @@ -10,7 +10,7 @@ public: ArchHooks_darwin(); ~ArchHooks_darwin(); void DumpDebugInfo(); - CString GetPreferredLanguage(); + RString GetPreferredLanguage(); void EnterTimeCriticalSection(); void ExitTimeCriticalSection();