From a635640f4ccc463cd51774a834ff3a2fef2bf4b8 Mon Sep 17 00:00:00 2001 From: Mathieu Schroeter Date: Thu, 24 Aug 2017 10:52:40 +0200 Subject: [PATCH] Save the selected language in the info file if different of user's locale --- src/event.cxx | 60 ++++++++++++++++++++++++++++++++++++++++----------- src/event.h | 8 +++++-- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/event.cxx b/src/event.cxx index 12d7950..71dac12 100644 --- a/src/event.cxx +++ b/src/event.cxx @@ -51,6 +51,7 @@ #define MAXDEMO 2000 typedef struct { + // v1.0 Sint16 majRev; Sint16 minRev; Sint16 reserve1[9]; @@ -65,7 +66,10 @@ typedef struct { Sint16 bAccessBuild; Sint16 prive; Sint16 skill; - Sint16 reserve2[93]; + // v1.1 + Sint16 language; + + Sint16 reserve2[92]; } DescInfo; // Toutes les premières lettres doivent @@ -1584,11 +1588,13 @@ CEvent::CEvent () m_Languages.push_back (Language::fr); m_Languages.push_back (Language::de); - if (GetLocale () == "en_US") + this->m_LangStart = GetLocale (); + + if (this->m_LangStart == "en_US") m_Lang = m_Languages.begin () + 1; - else if (GetLocale () == "fr") + else if (this->m_LangStart == "fr") m_Lang = m_Languages.begin () + 2; - else if (GetLocale () == "de") + else if (this->m_LangStart == "de") m_Lang = m_Languages.begin () + 3; else m_Lang = m_Languages.begin (); @@ -3611,30 +3617,52 @@ CEvent::PlayUp (Point pos) return true; } +Language +CEvent::GetStartLanguage () +{ + if (this->m_LangStart == "en_US") + return Language::en_US; + if (this->m_LangStart == "fr") + return Language::fr; + if (this->m_LangStart == "de") + return Language::de; + return Language::en; +} + +Language +CEvent::GetLanguage () +{ + return *this->m_Lang; +} + void -CEvent::SetLanguage () +CEvent::SetLanguage (Language lang) { static char env[64]; - const char * lang; + const char * slang; + + if (lang != Language::undef) + m_Lang = m_Languages.begin () + static_cast (lang); switch (*m_Lang) { default: + case Language::undef: case Language::en: - lang = "C"; + slang = "C"; break; case Language::en_US: - lang = "en_US"; + slang = "en_US"; break; case Language::fr: - lang = "fr"; + slang = "fr"; break; case Language::de: - lang = "de"; + slang = "de"; break; } - snprintf (env, sizeof (env), "LANGUAGE=%s", lang); + snprintf (env, sizeof (env), "LANGUAGE=%s", slang); { putenv (env); @@ -4411,7 +4439,7 @@ CEvent::WriteInfo () goto error; info.majRev = 1; - info.minRev = 0; + info.minRev = 1; info.prive = m_private; info.exercice = m_exercice; info.mission = m_mission; @@ -4426,6 +4454,11 @@ CEvent::WriteInfo () info.audioVolume = m_pSound->GetAudioVolume (); info.midiVolume = m_pSound->GetMidiVolume (); + /* Global settings */ + info.language = static_cast ( + this->GetLanguage () != this->GetStartLanguage () ? this->GetLanguage () + : Language::undef); + nb = fwrite (&info, sizeof (info), 1, file); if (nb < 1) goto error; @@ -4474,6 +4507,9 @@ CEvent::ReadInfo () m_pSound->SetAudioVolume (info.audioVolume); m_pSound->SetMidiVolume (info.midiVolume); + if ((info.majRev == 1 && info.minRev >= 1) || info.majRev >= 2) + this->SetLanguage (static_cast (info.language)); + fclose (file); return true; diff --git a/src/event.h b/src/event.h index cf6a750..1b32cd0 100644 --- a/src/event.h +++ b/src/event.h @@ -76,6 +76,7 @@ struct DemoSDLEvent { }; enum class Language { + undef = -1, en = 0, en_US = 1, fr = 2, @@ -155,8 +156,10 @@ protected: bool PlayMove (Point pos); bool PlayUp (Point pos); - void SetLanguage (); - void SetWindowSize (Uint8 prevScale, Uint8 newScale); + Language GetStartLanguage (); + Language GetLanguage (); + void SetLanguage (Language lang = Language::undef); + void SetWindowSize (Uint8 prevScale, Uint8 newScale); void ChangeButtons (Sint32 message); @@ -181,6 +184,7 @@ protected: protected: std::vector m_Languages; std::vector::iterator m_Lang; + std::string m_LangStart; Sint32 m_speed; Sint32 m_exercice; Sint32 m_mission;