@@ -216,29 +216,74 @@ bool gui_application::Init()
216216 return true ;
217217}
218218
219- void gui_application::SwitchTranslator (QTranslator& translator, const QString& filename, const QString& language_code)
219+ void gui_application::SwitchTranslator (const QString& language_code)
220220{
221221 // remove the old translator
222- removeTranslator (&translator);
222+ removeTranslator (&m_translator);
223+ for (QTranslator* qt_translator : m_qt_translators)
224+ {
225+ removeTranslator (qt_translator);
226+ qt_translator->deleteLater ();
227+ }
228+ m_qt_translators.clear ();
223229
230+ const QString default_code = QLocale (QLocale::English).bcp47Name ();
224231 const QString lang_path = QLibraryInfo::path (QLibraryInfo::TranslationsPath) + QStringLiteral (" /" );
225- const QString file_path = lang_path + filename;
226232
233+ // Load qt translation files
234+ const QDir dir (lang_path);
235+ if (dir.exists ())
236+ {
237+ QStringList qm_files = dir.entryList (QStringList () << QStringLiteral (" qt*_%1.qm" ).arg (language_code), QDir::Files | QDir::Readable);
238+ if (qm_files.empty ())
239+ {
240+ qm_files = dir.entryList (QStringList () << QStringLiteral (" qt*_%1.qm" ).arg (QLocale::languageToCode (QLocale (language_code).language ())), QDir::Files | QDir::Readable);
241+ }
242+
243+ for (const QString& qm_file : qm_files)
244+ {
245+ const QString file_path = lang_path + qm_file;
246+ QTranslator* qt_translator = new QTranslator (this );
247+
248+ if (qt_translator->load (file_path))
249+ {
250+ gui_log.notice (" Installing translation: '%s'" , file_path);
251+ installTranslator (qt_translator);
252+ m_qt_translators.push_back (std::move (qt_translator));
253+ }
254+ else
255+ {
256+ gui_log.error (" Failed to load translation: '%s'" , file_path);
257+ qt_translator->deleteLater ();
258+ }
259+ }
260+ }
261+ else
262+ {
263+ gui_log.error (" Qt translation dir '%s' does not exist" , lang_path);
264+ }
265+
266+ const QString file_path = lang_path + QStringLiteral (" rpcs3_%1.qm" ).arg (language_code);
227267 if (QFileInfo (file_path).isFile ())
228268 {
229269 // load the new translator
230- if (translator .load (file_path))
270+ if (m_translator .load (file_path))
231271 {
232- installTranslator (&translator);
272+ gui_log.notice (" Installing translation: '%s'" , file_path);
273+ installTranslator (&m_translator);
274+ }
275+ else
276+ {
277+ gui_log.error (" Failed to load translation: '%s'" , file_path);
233278 }
234279 }
235- else if (QString default_code = QLocale (QLocale::English). bcp47Name (); language_code != default_code)
280+ else if (language_code != default_code)
236281 {
237282 // show error, but ignore default case "en", since it is handled in source code
238- gui_log.error (" No translation file found in: %s " , file_path);
283+ gui_log.error (" No translation file found in: '%s' " , file_path);
239284
240285 // reset current language to default "en"
241- set_language_code (std::move ( default_code) );
286+ set_language_code (default_code);
242287 }
243288}
244289
@@ -260,7 +305,7 @@ void gui_application::LoadLanguage(const QString& language_code)
260305 // As per QT recommendations to avoid conflicts for POSIX functions
261306 std::setlocale (LC_NUMERIC , " C" );
262307
263- SwitchTranslator (m_translator, QStringLiteral ( " rpcs3_%1.qm " ). arg (language_code), language_code);
308+ SwitchTranslator (language_code);
264309
265310 if (m_main_window)
266311 {
@@ -285,6 +330,7 @@ QStringList gui_application::GetAvailableLanguageCodes()
285330 QStringList language_codes;
286331
287332 const QString language_path = QLibraryInfo::path (QLibraryInfo::TranslationsPath);
333+ gui_log.notice (" Checking languages in '%s'" , language_path);
288334
289335 if (QFileInfo (language_path).isDir ())
290336 {
@@ -303,10 +349,15 @@ QStringList gui_application::GetAvailableLanguageCodes()
303349 }
304350 else
305351 {
352+ gui_log.notice (" Found language '%s' (%s)" , language_code, filename);
306353 language_codes << language_code;
307354 }
308355 }
309356 }
357+ else
358+ {
359+ gui_log.error (" Language dir not found: '%s'" , language_path);
360+ }
310361
311362 return language_codes;
312363}
0 commit comments