@@ -44,6 +44,7 @@ CLocalGUI::CLocalGUI()
4444
4545 m_LastSettingsRevision = -1 ;
4646 m_LocaleChangeCounter = 0 ;
47+ m_bHasQueuedLocaleChange = false ;
4748}
4849
4950CLocalGUI::~CLocalGUI ()
@@ -123,8 +124,15 @@ void CLocalGUI::ChangeLocale(const char* szName)
123124 CClientVariables* cvars = CCore::GetSingleton ().GetCVars ();
124125 m_LastSettingsRevision = cvars->GetRevision ();
125126
126- g_pLocalization->SetCurrentLanguage ();
127- m_LastLocaleName = szName;
127+ g_pLocalization->SetCurrentLanguage (szName ? szName : " " );
128+
129+ SString strCanonicalLocale = g_pLocalization->GetLanguageCode ();
130+ if (strCanonicalLocale.empty ())
131+ strCanonicalLocale = CVARS_GET_VALUE<SString>(" locale" );
132+ if (strCanonicalLocale.empty () && szName)
133+ strCanonicalLocale = szName;
134+
135+ m_LastLocaleName = strCanonicalLocale;
128136
129137 if (guiWasLoaded)
130138 {
@@ -211,6 +219,78 @@ void CLocalGUI::DestroyObjects()
211219 SAFE_DELETE (m_pLabelVersionTag);
212220}
213221
222+ void CLocalGUI::RequestLocaleChange (const SString& strLocale)
223+ {
224+ if (strLocale.empty ())
225+ return ;
226+
227+ if (m_bHasQueuedLocaleChange && strLocale == m_QueuedLocaleChange)
228+ return ;
229+
230+ const SString strCurrentLocale = CVARS_GET_VALUE<SString>(" locale" );
231+ if (!m_bHasQueuedLocaleChange && strLocale == strCurrentLocale && strLocale == m_LastLocaleName)
232+ return ;
233+
234+ if (m_LocaleChangeCounter > 0 )
235+ CCore::GetSingleton ().RemoveMessageBox ();
236+
237+ m_QueuedLocaleChange = strLocale;
238+ m_bHasQueuedLocaleChange = true ;
239+ m_LocaleChangeCounter = 0 ;
240+
241+ // Keep the cvar at the last applied locale so dependent systems remain stable while we rebuild UI
242+ if (!m_LastLocaleName.empty () && strCurrentLocale != m_LastLocaleName)
243+ CVARS_SET (" locale" , m_LastLocaleName);
244+ }
245+
246+ void CLocalGUI::ApplyQueuedLocale ()
247+ {
248+ if (!m_bHasQueuedLocaleChange)
249+ return ;
250+
251+ CClientVariables* cvars = CCore::GetSingleton ().GetCVars ();
252+
253+ if (m_QueuedLocaleChange.empty ())
254+ {
255+ m_bHasQueuedLocaleChange = false ;
256+ m_LocaleChangeCounter = 0 ;
257+ CCore::GetSingleton ().RemoveMessageBox ();
258+ return ;
259+ }
260+
261+ if (CCore::GetSingleton ().GetModManager ()->IsLoaded ())
262+ {
263+ CCore::GetSingleton ().GetConsole ()->Printf (" Please disconnect before changing language" );
264+ if (cvars)
265+ cvars->Set (" locale" , m_LastLocaleName);
266+
267+ m_bHasQueuedLocaleChange = false ;
268+ m_QueuedLocaleChange.clear ();
269+ m_LocaleChangeCounter = 0 ;
270+ CCore::GetSingleton ().RemoveMessageBox ();
271+ return ;
272+ }
273+
274+ ChangeLocale (m_QueuedLocaleChange);
275+
276+ m_bHasQueuedLocaleChange = false ;
277+ SString strAppliedLocale = m_LastLocaleName;
278+ m_QueuedLocaleChange.clear ();
279+ m_LocaleChangeCounter = 0 ;
280+
281+ if (!strAppliedLocale.empty ())
282+ {
283+ SString strCurrentLocale = CVARS_GET_VALUE<SString>(" locale" );
284+ if (strCurrentLocale != strAppliedLocale)
285+ CVARS_SET (" locale" , strAppliedLocale);
286+ }
287+
288+ if (cvars)
289+ m_LastSettingsRevision = cvars->GetRevision ();
290+
291+ CCore::GetSingleton ().RemoveMessageBox ();
292+ }
293+
214294void CLocalGUI::DoPulse ()
215295{
216296 m_pVersionUpdater->DoPulse ();
@@ -247,33 +327,21 @@ void CLocalGUI::DoPulse()
247327 {
248328 m_LastLocaleName = currentLocaleName;
249329 }
250- if (currentLocaleName != m_LastLocaleName)
330+ else if (!m_bHasQueuedLocaleChange && currentLocaleName != m_LastLocaleName)
251331 {
252- m_LocaleChangeCounter++;
253- if (m_LocaleChangeCounter < 5 )
254- {
255- // Do GUI stuff for first 5 frames
256- // Force pulse next time
257- m_LastSettingsRevision = cvars->GetRevision () - 1 ;
332+ RequestLocaleChange (currentLocaleName);
333+ }
334+ }
258335
259- if (m_LocaleChangeCounter == 2 )
260- CCore::GetSingleton ().ShowMessageBox (_E (" CC99" ), (" Changing language, please wait..." ), MB_ICON_INFO);
261- }
262- else
263- {
264- // Do actual locale change
265- m_LocaleChangeCounter = 0 ;
266- CCore::GetSingleton ().RemoveMessageBox ();
336+ if (m_bHasQueuedLocaleChange)
337+ {
338+ m_LocaleChangeCounter++;
267339
268- if (!CCore::GetSingleton ().GetModManager ()->IsLoaded ())
269- ChangeLocale (currentLocaleName);
270- else
271- {
272- CCore::GetSingleton ().GetConsole ()->Printf (" Please disconnect before changing language" );
273- cvars->Set (" locale" , m_LastLocaleName);
274- }
275- }
276- }
340+ if (m_LocaleChangeCounter == 2 )
341+ CCore::GetSingleton ().ShowMessageBox (_E (" CC99" ), (" Changing language, please wait..." ), MB_ICON_INFO);
342+
343+ if (m_LocaleChangeCounter >= 5 )
344+ ApplyQueuedLocale ();
277345 }
278346}
279347
0 commit comments