Add primitive language support
This commit is contained in:
@@ -1923,6 +1923,7 @@ RandomBackgrounds=Choose the maximum number of random backgrounds to be loaded s
|
||||
|
||||
[ScreenAppearanceOptions]
|
||||
HelpText=&UP; &DOWN; to change line &LEFT; &RIGHT; to select between options::START to accept changes BACK to discard changes
|
||||
Language=Choose your language.
|
||||
Announcer=Choose from this list of installed annoucner packs.::For more information about creating announcer packs, see the README.
|
||||
Theme=Choose from this list of installed theme packs.::For more information about creating theme packs, see the README.
|
||||
DefaultNoteSkin=Choose from this list of installed note skins.::For more information about creating a note skin, see the README.
|
||||
|
||||
@@ -131,6 +131,7 @@ PrefsManager::PrefsManager()
|
||||
* already here than lots of people asking why songs aren't being displayed. */
|
||||
m_bHiddenSongs = false;
|
||||
m_bVsync = true;
|
||||
m_sLanguage = ""; // ThemeManager will deal with this invalid language
|
||||
|
||||
/* XXX: Set these defaults for individual consoles using VideoCardDefaults.ini. */
|
||||
#ifdef _XBOX
|
||||
@@ -265,6 +266,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk( bool bSwitchToLastPlayedGame )
|
||||
ini.GetValueB( "Options", "ForceLogFlush", m_bForceLogFlush );
|
||||
ini.GetValueB( "Options", "Logging", m_bLogging );
|
||||
ini.GetValueB( "Options", "ShowLogWindow", m_bShowLogWindow );
|
||||
ini.GetValue ( "Options", "Language", m_sLanguage );
|
||||
|
||||
|
||||
m_asAdditionalSongFolders.clear();
|
||||
@@ -377,6 +379,7 @@ void PrefsManager::SaveGlobalPrefsToDisk()
|
||||
ini.SetValueI( "Options", "ProgressiveLifebar", m_iProgressiveLifebar );
|
||||
ini.SetValueI( "Options", "ProgressiveStageLifebar", m_iProgressiveStageLifebar );
|
||||
ini.SetValueI( "Options", "ProgressiveNonstopLifebar", m_iProgressiveNonstopLifebar );
|
||||
ini.SetValue ( "Options", "Language", m_sLanguage );
|
||||
|
||||
/* Only write these if they aren't the default. This ensures that we can change
|
||||
* the default and have it take effect for everyone (except people who
|
||||
@@ -413,7 +416,7 @@ void PrefsManager::ReadGamePrefsFromDisk()
|
||||
|
||||
// it's OK to call these functions with names that don't exist.
|
||||
ANNOUNCER->SwitchAnnouncer( sAnnouncer );
|
||||
THEME->SwitchTheme( sTheme );
|
||||
THEME->SwitchThemeAndLanguage( sTheme, m_sLanguage );
|
||||
|
||||
// XXX: ?
|
||||
// if(NOTESKIN->DoesNoteSkinExist(sNoteSkin))
|
||||
|
||||
@@ -92,6 +92,7 @@ public:
|
||||
int m_iProgressiveLifebar;
|
||||
int m_iProgressiveStageLifebar;
|
||||
int m_iProgressiveNonstopLifebar;
|
||||
CString m_sLanguage;
|
||||
|
||||
// course ranking
|
||||
enum { COURSE_SORT_SONGS, COURSE_SORT_METER, COURSE_SORT_METER_SUM, COURSE_SORT_RANK } m_iCourseSortOrder;
|
||||
|
||||
@@ -28,7 +28,8 @@
|
||||
|
||||
|
||||
enum {
|
||||
AO_ANNOUNCER = 0,
|
||||
AO_LANGUAGE = 0,
|
||||
AO_ANNOUNCER,
|
||||
AO_THEME,
|
||||
AO_SKIN,
|
||||
AO_INSTRUCTIONS,
|
||||
@@ -46,6 +47,7 @@ enum {
|
||||
|
||||
|
||||
OptionRow g_AppearanceOptionsLines[NUM_APPEARANCE_OPTIONS_LINES] = {
|
||||
OptionRow( "Language" ),
|
||||
OptionRow( "Announcer" ),
|
||||
OptionRow( "Theme" ),
|
||||
OptionRow( "Default\nNoteSkin" ),
|
||||
@@ -80,6 +82,25 @@ void ScreenAppearanceOptions::ImportOptions()
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
//
|
||||
// fill in language names
|
||||
//
|
||||
CStringArray arrayLanguages;
|
||||
THEME->GetLanguages( arrayLanguages );
|
||||
|
||||
m_OptionRow[AO_LANGUAGE].choices.clear();
|
||||
for( i=0; i<arrayLanguages.size() && i<MAX_OPTIONS_PER_LINE; i++ )
|
||||
{
|
||||
m_OptionRow[AO_LANGUAGE].choices.push_back( arrayLanguages[i] );
|
||||
}
|
||||
|
||||
// highlight currently selected announcer
|
||||
m_iSelectedOption[0][AO_LANGUAGE] = 0;
|
||||
for( i=1; i<m_OptionRow[AO_LANGUAGE].choices.size(); i++ )
|
||||
if( 0==stricmp(m_OptionRow[AO_LANGUAGE].choices[i], THEME->GetCurLanguage()) )
|
||||
m_iSelectedOption[0][AO_LANGUAGE] = i;
|
||||
|
||||
|
||||
//
|
||||
// fill in announcer names
|
||||
//
|
||||
@@ -170,7 +191,7 @@ void ScreenAppearanceOptions::ExportOptions()
|
||||
CString sNewTheme = m_OptionRow[AO_THEME].choices[iSelectedTheme];
|
||||
if( THEME->GetCurThemeName() != sNewTheme )
|
||||
{
|
||||
THEME->SwitchTheme( sNewTheme );
|
||||
THEME->SwitchThemeAndLanguage( sNewTheme, THEME->GetCurLanguage() );
|
||||
ApplyGraphicOptions(); // reset graphics to apply new window title and icon
|
||||
|
||||
SONGMAN->UpdateRankingCourses(); // update ranking courses
|
||||
|
||||
@@ -183,9 +183,9 @@ void ResetGame()
|
||||
{
|
||||
CString sGameName = GAMESTATE->GetCurrentGameDef()->m_szName;
|
||||
if( THEME->DoesThemeExist( sGameName ) )
|
||||
THEME->SwitchTheme( sGameName );
|
||||
THEME->SwitchThemeAndLanguage( sGameName, THEME->GetCurLanguage() );
|
||||
else
|
||||
THEME->SwitchTheme( "default" );
|
||||
THEME->SwitchThemeAndLanguage( "default", THEME->GetCurLanguage() );
|
||||
TEXTUREMAN->DoDelayedDelete();
|
||||
}
|
||||
PREFSMAN->SaveGamePrefsToDisk();
|
||||
|
||||
@@ -31,7 +31,10 @@ ThemeManager* THEME = NULL; // global object accessable from anywhere in the pro
|
||||
|
||||
|
||||
const CString BASE_THEME_NAME = "default";
|
||||
const CString LANGUAGES_SUBDIR = "Languages" SLASH;
|
||||
const CString BASE_LANGUAGE = "english";
|
||||
const CString THEMES_DIR = BASE_PATH "Themes" SLASH;
|
||||
const CString METRICS_FILE = "metrics.ini";
|
||||
const CString ELEMENT_CATEGORY_STRING[NUM_ELEMENT_CATEGORIES] =
|
||||
{
|
||||
"BGAnimations",
|
||||
@@ -46,7 +49,12 @@ ThemeManager::ThemeManager()
|
||||
m_pIniMetrics = new IniFile;
|
||||
|
||||
m_sCurThemeName = BASE_THEME_NAME; // Use the base theme for now. It's up to PrefsManager to change this.
|
||||
m_uHashForCurThemeMetrics = m_uHashForBaseThemeMetrics = 0;
|
||||
m_uHashForCurThemeMetrics = 0;
|
||||
m_uHashForBaseThemeMetrics = 0;
|
||||
m_uHashForCurThemeCurLanguage = 0;
|
||||
m_uHashForBaseThemeCurLanguage = 0;
|
||||
m_uHashForCurThemeBaseLanguage = 0;
|
||||
m_uHashForBaseThemeBaseLanguage = 0;
|
||||
|
||||
CStringArray arrayThemeNames;
|
||||
GetThemeNames( arrayThemeNames );
|
||||
@@ -83,25 +91,69 @@ bool ThemeManager::DoesThemeExist( CString sThemeName )
|
||||
return false;
|
||||
}
|
||||
|
||||
void ThemeManager::SwitchTheme( CString sThemeName )
|
||||
void ThemeManager::GetLanguages( CStringArray& AddTo )
|
||||
{
|
||||
AddTo.clear();
|
||||
CStringArray asTemp;
|
||||
|
||||
GetLanguagesForTheme( m_sCurThemeName, AddTo );
|
||||
GetLanguagesForTheme( BASE_THEME_NAME, asTemp );
|
||||
AddTo.insert( AddTo.begin(), asTemp.begin(), asTemp.end() );
|
||||
|
||||
// remove dupes
|
||||
sort( AddTo.begin(), AddTo.end() );
|
||||
CStringArray::iterator it = unique( AddTo.begin(), AddTo.end() );
|
||||
AddTo.erase(it, AddTo.end());
|
||||
}
|
||||
|
||||
bool ThemeManager::DoesLanguageExist( CString sLanguage )
|
||||
{
|
||||
CStringArray asLanguages;
|
||||
GetLanguages( asLanguages );
|
||||
|
||||
for( unsigned i=0; i<asLanguages.size(); i++ )
|
||||
if( sLanguage.CompareNoCase(asLanguages[i])==0 )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void ThemeManager::SwitchThemeAndLanguage( CString sThemeName, CString sLanguage )
|
||||
{
|
||||
if( !DoesThemeExist(sThemeName) )
|
||||
m_sCurThemeName = BASE_THEME_NAME;
|
||||
else
|
||||
m_sCurThemeName = sThemeName;
|
||||
|
||||
if( !DoesLanguageExist(sLanguage) )
|
||||
m_sCurLanguage = BASE_LANGUAGE;
|
||||
else
|
||||
m_sCurLanguage = sLanguage;
|
||||
|
||||
// update hashes for metrics files
|
||||
m_uHashForCurThemeMetrics = GetHashForFile( GetMetricsPathFromName(m_sCurThemeName) );
|
||||
m_uHashForBaseThemeMetrics = GetHashForFile( GetMetricsPathFromName(BASE_THEME_NAME) );
|
||||
m_uHashForCurThemeMetrics = GetHashForFile( GetMetricsIniPath(m_sCurThemeName) );
|
||||
m_uHashForBaseThemeMetrics = GetHashForFile( GetMetricsIniPath(BASE_THEME_NAME) );
|
||||
m_uHashForBaseThemeBaseLanguage = GetHashForFile( GetLanguageIniPath(BASE_THEME_NAME,BASE_LANGUAGE) );
|
||||
m_uHashForCurThemeBaseLanguage = GetHashForFile( GetLanguageIniPath(m_sCurThemeName,BASE_LANGUAGE) );
|
||||
m_uHashForBaseThemeCurLanguage = GetHashForFile( GetLanguageIniPath(BASE_THEME_NAME,m_sCurLanguage) );
|
||||
m_uHashForCurThemeCurLanguage = GetHashForFile( GetLanguageIniPath(m_sCurThemeName,m_sCurLanguage) );
|
||||
|
||||
// read new metrics. First read base metrics, then read cur theme's metrics, overriding base theme
|
||||
m_pIniMetrics->Reset();
|
||||
m_pIniMetrics->SetPath( GetMetricsPathFromName(BASE_THEME_NAME) );
|
||||
m_pIniMetrics->SetPath( GetMetricsIniPath(BASE_THEME_NAME) );
|
||||
m_pIniMetrics->ReadFile();
|
||||
m_pIniMetrics->SetPath( GetMetricsPathFromName(m_sCurThemeName) );
|
||||
m_pIniMetrics->SetPath( GetMetricsIniPath(m_sCurThemeName) );
|
||||
m_pIniMetrics->ReadFile();
|
||||
m_pIniMetrics->SetPath( GetLanguageIniPath(BASE_THEME_NAME,BASE_LANGUAGE) );
|
||||
m_pIniMetrics->ReadFile();
|
||||
m_pIniMetrics->SetPath( GetLanguageIniPath(m_sCurThemeName,BASE_LANGUAGE) );
|
||||
m_pIniMetrics->ReadFile();
|
||||
m_pIniMetrics->SetPath( GetLanguageIniPath(BASE_THEME_NAME,m_sCurLanguage) );
|
||||
m_pIniMetrics->ReadFile();
|
||||
m_pIniMetrics->SetPath( GetLanguageIniPath(m_sCurThemeName,m_sCurLanguage) );
|
||||
m_pIniMetrics->ReadFile();
|
||||
|
||||
LOG->MapLog("theme", "Theme: %s", sThemeName.c_str());
|
||||
LOG->MapLog("language", "Language: %s", sLanguage.c_str());
|
||||
}
|
||||
|
||||
CString ThemeManager::GetThemeDirFromName( const CString &sThemeName )
|
||||
@@ -273,9 +325,9 @@ try_element_again:
|
||||
}
|
||||
|
||||
|
||||
CString ThemeManager::GetMetricsPathFromName( CString sThemeName )
|
||||
CString ThemeManager::GetMetricsIniPath( CString sThemeName )
|
||||
{
|
||||
return GetThemeDirFromName( sThemeName ) + "metrics.ini";
|
||||
return GetThemeDirFromName( sThemeName ) + METRICS_FILE;
|
||||
}
|
||||
|
||||
bool ThemeManager::HasMetric( CString sClassName, CString sValueName )
|
||||
@@ -289,8 +341,8 @@ CString ThemeManager::GetMetricRaw( CString sClassName, CString sValueName )
|
||||
#if defined(DEBUG) && defined(WIN32)
|
||||
try_metric_again:
|
||||
#endif
|
||||
CString sCurMetricPath = GetMetricsPathFromName(m_sCurThemeName);
|
||||
CString sDefaultMetricPath = GetMetricsPathFromName(BASE_THEME_NAME);
|
||||
CString sCurMetricPath = GetMetricsIniPath(m_sCurThemeName);
|
||||
CString sDefaultMetricPath = GetMetricsIniPath(BASE_THEME_NAME);
|
||||
|
||||
// Is our metric cache out of date?
|
||||
if ( !m_uHashForBaseThemeMetrics || m_ReloadTimer.PeekDeltaTime() >= 1 )
|
||||
@@ -305,7 +357,7 @@ try_metric_again:
|
||||
LOG->Warn( "Metrics file is out of date. Reloading..." );
|
||||
// MessageBeep( MB_OK );
|
||||
}
|
||||
SwitchTheme(m_sCurThemeName); // force a reload of the metrics cache
|
||||
SwitchThemeAndLanguage(m_sCurThemeName, m_sCurLanguage); // force a reload of the metrics cache
|
||||
}
|
||||
}
|
||||
|
||||
@@ -378,5 +430,28 @@ void ThemeManager::NextTheme()
|
||||
if( as[i].CompareNoCase(m_sCurThemeName)==0 )
|
||||
break;
|
||||
int iNewIndex = (i+1)%as.size();
|
||||
SwitchTheme( as[iNewIndex] );
|
||||
SwitchThemeAndLanguage( as[iNewIndex], m_sCurLanguage );
|
||||
}
|
||||
|
||||
void ThemeManager::GetLanguagesForTheme( CString sThemeName, CStringArray& asLanguagesOut )
|
||||
{
|
||||
CString sLanguageDir = GetThemeDirFromName(sThemeName) + LANGUAGES_SUBDIR;
|
||||
CStringArray as;
|
||||
GetDirListing( sLanguageDir + "*.ini", as );
|
||||
|
||||
// stip out metrics.ini
|
||||
for( int i=as.size()-1; i>=0; i-- )
|
||||
{
|
||||
if( as[i].CompareNoCase(METRICS_FILE)==0 )
|
||||
as.erase( as.begin()+i );
|
||||
// strip ".ini"
|
||||
as[i] = as[i].Left( as[i].size()-4 );
|
||||
}
|
||||
|
||||
asLanguagesOut = as;
|
||||
}
|
||||
|
||||
CString ThemeManager::GetLanguageIniPath( CString sThemeName, CString sLanguage )
|
||||
{
|
||||
return GetThemeDirFromName(sThemeName) + LANGUAGES_SUBDIR + sLanguage + ".ini";
|
||||
}
|
||||
|
||||
@@ -27,8 +27,11 @@ public:
|
||||
|
||||
void GetThemeNames( CStringArray& AddTo );
|
||||
bool DoesThemeExist( CString sThemeName );
|
||||
void SwitchTheme( CString sThemeName );
|
||||
void GetLanguages( CStringArray& AddTo );
|
||||
bool DoesLanguageExist( CString sLanguage );
|
||||
void SwitchThemeAndLanguage( CString sThemeName, CString sLanguage );
|
||||
CString GetCurThemeName() { return m_sCurThemeName; };
|
||||
CString GetCurLanguage() { return m_sCurLanguage; };
|
||||
CString GetCurThemeDir() { return GetThemeDirFromName(m_sCurThemeName); };
|
||||
void NextTheme();
|
||||
|
||||
@@ -51,13 +54,20 @@ protected:
|
||||
CString GetPathTo( CString sThemeName, ElementCategory category, CString sFileName );
|
||||
static CString GetThemeDirFromName( const CString &sThemeName );
|
||||
CString GetElementDir( CString sThemeName );
|
||||
static CString GetMetricsPathFromName( CString sThemeName );
|
||||
static CString GetMetricsIniPath( CString sThemeName );
|
||||
static void GetLanguagesForTheme( CString sThemeName, CStringArray& asLanguagesOut );
|
||||
static CString GetLanguageIniPath( CString sThemeName, CString sLanguage );
|
||||
|
||||
CString m_sCurThemeName;
|
||||
CString m_sCurLanguage;
|
||||
|
||||
IniFile* m_pIniMetrics; // make this a pointer so we don't have to include IniFile in this header!
|
||||
IniFile* m_pIniMetrics; // make this a pointer so we don't have to include IniFile here
|
||||
unsigned m_uHashForCurThemeMetrics;
|
||||
unsigned m_uHashForBaseThemeMetrics;
|
||||
unsigned m_uHashForCurThemeCurLanguage;
|
||||
unsigned m_uHashForBaseThemeCurLanguage;
|
||||
unsigned m_uHashForCurThemeBaseLanguage;
|
||||
unsigned m_uHashForBaseThemeBaseLanguage;
|
||||
RageTimer m_ReloadTimer;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user