From 00578338f0322821a89a2fa962dc83a46c49ad5a Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 24 Jun 2008 10:49:06 +0000 Subject: [PATCH] read optional language inis so that non-theme packages can provide strings (for example, the translated name of the package) --- stepmania/src/ThemeManager.cpp | 36 +++++++++++++++++++++++++--------- stepmania/src/ThemeManager.h | 1 + 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index dd809b34b7..eee5d817a5 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -288,7 +288,14 @@ void ThemeManager::LoadThemeMetrics( const RString &sThemeName_, const RString & IniFile iniMetrics; IniFile iniStrings; iniMetrics.ReadFile( GetMetricsIniPath(sThemeName) ); - iniStrings.ReadFile( GetLanguageIniPath(sThemeName,SpecialFiles::BASE_LANGUAGE) ); + // Load optional language inis (probably mounted by a package) first so that they can be overridden by the current theme. + { + vector vs; + GetOptionalLanguageIniPaths(vs,sThemeName,sLanguage); + FOREACH_CONST(RString,vs,s) + iniStrings.ReadFile( *s ); + } + iniStrings.ReadFile( GetLanguageIniPath(sThemeName,SpecialFiles::BASE_LANGUAGE) ); if( sLanguage.CompareNoCase(SpecialFiles::BASE_LANGUAGE) ) iniStrings.ReadFile( GetLanguageIniPath(sThemeName,sLanguage) ); @@ -1015,16 +1022,21 @@ void ThemeManager::GetLanguagesForTheme( const RString &sThemeName, vector as; GetDirListing( sLanguageDir + "*.ini", as ); - // strip out metrics.ini - for( int i=as.size()-1; i>=0; i-- ) + FOREACH_CONST( RString, as, s ) { - if( as[i].CompareNoCase(SpecialFiles::METRICS_FILE)==0 ) - as.erase( as.begin()+i ); - // strip ".ini" - as[i] = as[i].Left( as[i].size()-4 ); - } + // ignore metrics.ini + if( s->CompareNoCase(SpecialFiles::METRICS_FILE)==0 ) + continue; - asLanguagesOut.insert( asLanguagesOut.end(), as.begin(), as.end() ); + // Ignore filenames with a space. These are optional language inis that probably came from a mounted package. + if( s->find(" ") != RString::npos ) + continue; + + // strip ".ini" + RString s2 = s->Left( s->size()-4 ); + + asLanguagesOut.push_back( s2 ); + } } RString ThemeManager::GetLanguageIniPath( const RString &sThemeName, const RString &sLanguage ) @@ -1032,6 +1044,12 @@ RString ThemeManager::GetLanguageIniPath( const RString &sThemeName, const RStri return GetThemeDirFromName(sThemeName) + SpecialFiles::LANGUAGES_SUBDIR + sLanguage + ".ini"; } +void ThemeManager::GetOptionalLanguageIniPaths( vector &vsPathsOut, const RString &sThemeName, const RString &sLanguage ) +{ + // optional ini names look like: "en PackageName.ini" + GetDirListing( GetThemeDirFromName(sThemeName) + SpecialFiles::LANGUAGES_SUBDIR + sLanguage + " *.ini", vsPathsOut, false, true ); +} + void ThemeManager::GetOptionNames( vector& AddTo ) { const XNode *cur = g_pLoadedThemeData->iniStrings.GetChild( "OptionNames" ); diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index e8b405468b..87ffd059a2 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -119,6 +119,7 @@ protected: static RString GetMetricsIniPath( const RString &sThemeName ); static void GetLanguagesForTheme( const RString &sThemeName, vector& asLanguagesOut ); static RString GetLanguageIniPath( const RString &sThemeName, const RString &sLanguage ); + void GetOptionalLanguageIniPaths( vector &vsPathsOut, const RString &sThemeName, const RString &sLanguage ); RString GetDefaultLanguage(); RString m_sCurThemeName;