diff --git a/stepmania/src/LocalizedString.cpp b/stepmania/src/LocalizedString.cpp index 3ecfb4934e..3695f3f139 100644 --- a/stepmania/src/LocalizedString.cpp +++ b/stepmania/src/LocalizedString.cpp @@ -17,11 +17,11 @@ void LocalizedString::RegisterLocalizer( RString (*pfnLocalizer)(const RString&, #include "SubscriptionManager.h" template<> -set* SubscriptionManager::s_pSubscribers = NULL; +SubscriptionHandler g_Subscribers; void LocalizedString::RefreshLocalizedStrings() { - FOREACHS( LocalizedString*, *SubscriptionManager::s_pSubscribers, p ) + FOREACHS( LocalizedString*, *g_Subscribers.m_pSubscribers, p ) (*p)->Refresh(); } @@ -36,7 +36,7 @@ LocalizedString::LocalizedString( const RString &sSection, const RString &sName m_sName = sName; m_sValue = sName; - SubscriptionManager::Subscribe( this ); + g_Subscribers.Subscribe( this ); Refresh(); } @@ -44,7 +44,7 @@ LocalizedString::LocalizedString( const RString &sSection, const RString &sName LocalizedString::~LocalizedString() { - SubscriptionManager::Unsubscribe( this ); + g_Subscribers.Unsubscribe( this ); } diff --git a/stepmania/src/LuaReference.cpp b/stepmania/src/LuaReference.cpp index 3b4c5a0492..0f14dcb2e0 100644 --- a/stepmania/src/LuaReference.cpp +++ b/stepmania/src/LuaReference.cpp @@ -9,24 +9,23 @@ REGISTER_CLASS_TRAITS( LuaReference, new LuaReference(*pCopy) ) -template<> -set* SubscriptionManager::s_pSubscribers = NULL; +SubscriptionHandler g_Subscribers; LuaReference::LuaReference() { m_iReference = LUA_NOREF; - SubscriptionManager::Subscribe( this ); + g_Subscribers.Subscribe( this ); } LuaReference::~LuaReference() { Unregister(); - SubscriptionManager::Unsubscribe( this ); + g_Subscribers.Unsubscribe( this ); } LuaReference::LuaReference( const LuaReference &cpy ) { - SubscriptionManager::Subscribe( this ); + g_Subscribers.Subscribe( this ); if( cpy.m_iReference == LUA_NOREF ) m_iReference = LUA_NOREF; @@ -135,17 +134,17 @@ void LuaReference::Unregister() void LuaReference::BeforeResetAll() { - if( SubscriptionManager::s_pSubscribers == NULL ) + if( g_Subscribers.m_pSubscribers == NULL ) return; - FOREACHS( LuaReference*, *SubscriptionManager::s_pSubscribers, p ) + FOREACHS( LuaReference*, *g_Subscribers.m_pSubscribers, p ) (*p)->BeforeReset(); } void LuaReference::AfterResetAll() { - if( SubscriptionManager::s_pSubscribers == NULL ) + if( g_Subscribers.m_pSubscribers == NULL ) return; - FOREACHS( LuaReference*, *SubscriptionManager::s_pSubscribers, p ) + FOREACHS( LuaReference*, *g_Subscribers.m_pSubscribers, p ) (*p)->ReRegister(); } diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index 74d55459e7..2073bb13c4 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -310,7 +310,8 @@ PrefsManager::PrefsManager() : m_bShowLogOutput ( "ShowLogOutput", false ), m_bLogSkips ( "LogSkips", false ), m_bLogCheckpoints ( "LogCheckpoints", false ), - m_bShowLoadingWindow ( "ShowLoadingWindow", true ) + m_bShowLoadingWindow ( "ShowLoadingWindow", true ), + m_bPseudoLocalize ( "PseudoLocalize", false ) #if !defined(WITHOUT_NETWORKING) , diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index 3adbaaf2ef..b01bc12fe0 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -236,6 +236,7 @@ public: Preference m_bLogSkips; Preference m_bLogCheckpoints; Preference m_bShowLoadingWindow; + Preference m_bPseudoLocalize; #if !defined(WITHOUT_NETWORKING) Preference m_bEnableScoreboard; //Alows disabling of scoreboard in network play diff --git a/stepmania/src/ProfileManager.cpp b/stepmania/src/ProfileManager.cpp index 7f5ace6d5b..7785ab2325 100644 --- a/stepmania/src/ProfileManager.cpp +++ b/stepmania/src/ProfileManager.cpp @@ -56,8 +56,8 @@ struct DirAndProfile static vector g_vLocalProfile; -static ThemeMetric FIXED_PROFILES( "ProfileManager", "FixedProfiles" ); -static ThemeMetric NUM_FIXED_PROFILES( "ProfileManager", "NumFixedProfiles" ); +static ThemeMetric FIXED_PROFILES ( "ProfileManager", "FixedProfiles" ); +static ThemeMetric NUM_FIXED_PROFILES ( "ProfileManager", "NumFixedProfiles" ); #define FIXED_PROFILE_CHARACTER_ID( i ) THEME->GetMetric( "ProfileManager", ssprintf("FixedProfileCharacterID%d",int(i+1)) ) diff --git a/stepmania/src/SubscriptionManager.h b/stepmania/src/SubscriptionManager.h index 7cb2b732ee..96d25408d7 100644 --- a/stepmania/src/SubscriptionManager.h +++ b/stepmania/src/SubscriptionManager.h @@ -4,37 +4,9 @@ #define SubscriptionManager_H #include -template -class SubscriptionManager -{ -public: - // TRICKY: If we make this a global instead of a global pointer, - // then we'd have to be careful that the static constructors of all - // subscribers are called before the collection constructor. It's - // impossible to enfore that in C++. Instead, we'll allocate the - // collection ourself on first use. - static set* s_pSubscribers; - - static void Subscribe( T* p ) - { - if( s_pSubscribers == NULL ) - s_pSubscribers = new set; -#if _DEBUG - typename set::iterator iter = s_pSubscribers->find( p ); - ASSERT_M( iter == s_pSubscribers->end(), "already subscribed" ); -#endif - s_pSubscribers->insert( p ); - } - - static void Unsubscribe( T* p ) - { - typename set::iterator iter = s_pSubscribers->find( p ); - ASSERT( iter != s_pSubscribers->end() ); - s_pSubscribers->erase( iter ); - } - -}; +// Since this class has only POD types and no constructor, there's no +// initialize order problem. template class SubscriptionHandler { diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 110ca8bdb5..1a3dba88ba 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -16,9 +16,6 @@ #include "Foreach.h" #include "ThemeMetric.h" #include "SubscriptionManager.h" -template<> -set* SubscriptionManager::s_pSubscribers = NULL; - #include "LuaManager.h" #include "ScreenDimensions.h" #include "Command.h" @@ -112,6 +109,7 @@ ThemeManager::ThemeManager() /* We don't have any theme loaded until SwitchThemeAndLanguage is called. */ m_sCurThemeName = ""; + m_bPseudoLocalilze = false; vector arrayThemeNames; GetThemeNames( arrayThemeNames ); @@ -318,7 +316,7 @@ void ThemeManager::SwitchThemeAndLanguage( const RString &sThemeName_, const RSt } // reload subscribers - if( SubscriptionManager::s_pSubscribers ) + if( g_Subscribers.m_pSubscribers ) { FOREACHS_CONST( IThemeMetric*, *g_Subscribers.m_pSubscribers, p ) (*p)->Read(); @@ -904,6 +902,11 @@ void ThemeManager::GetMetric( const RString &sClassName, const RString &sValueNa valueOut.SetFromExpression( "function(self) " + sValue + "end" ); } +void ThemeManager::SetPseudoLocalilze( bool b ) +{ + m_bPseudoLocalilze = b; +} + RString ThemeManager::GetString( const RString &sClassName, const RString &sValueName_ ) { RString sValueName = sValueName_; @@ -930,6 +933,28 @@ RString ThemeManager::GetString( const RString &sClassName, const RString &sValu s.Replace( "\\n", "\n" ); + if( m_bPseudoLocalilze ) + { + s.Replace( "a", "àá" ); + s.Replace( "A", "ÀÀ" ); + s.Replace( "e", "éé" ); + s.Replace( "E", "ÉÉ" ); + s.Replace( "i", "íí" ); + s.Replace( "I", "ÍÍ" ); + s.Replace( "o", "óó" ); + s.Replace( "O", "ÓÓ" ); + s.Replace( "u", "üü" ); + s.Replace( "U", "ÜÜ" ); + s.Replace( "n", "ñ" ); + s.Replace( "N", "Ñ" ); + s.Replace( "c", "ç" ); + s.Replace( "C", "Ç" ); + // transformations that helpexpose punctuation assumptions + s.Replace( ":", " :" ); + s.Replace( "?", " ?" ); + s.Replace( "!", " !" ); + } + return s; } diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index 018464e671..b04487852e 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -88,6 +88,8 @@ public: void GetMetric( const RString &sClassName, const RString &sValueName, apActorCommands &valueOut ); #endif + // Languages + void SetPseudoLocalilze( bool b ); RString GetString( const RString &sClassName, const RString &sValueName ); void GetMetricsThatBeginWith( const RString &sClassName, const RString &sValueName, set &vsValueNamesOut ); @@ -118,6 +120,7 @@ protected: RString m_sCurThemeName; RString m_sCurLanguage; + bool m_bPseudoLocalilze; }; extern ThemeManager* THEME; // global and accessable from anywhere in our program