diff --git a/ChangeLog b/ChangeLog index c4bcde136..031441b71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2015-09-20 Moritz Bunkus + * MKVToolNix GUI: bug fix: the interface language selection has + been improved not to select wrong entries resulting in error + messages from mkvmerge about unknown translations. Fixes #1434. + * MKVToolNix GUI: bug fix: if the Windows version of the GUI was started from a symbolically linked folder then it would crash when the user added a file. Fixes #1315. diff --git a/src/mkvtoolnix-gui/app.cpp b/src/mkvtoolnix-gui/app.cpp index 9cf7493f7..88f6fa009 100644 --- a/src/mkvtoolnix-gui/app.cpp +++ b/src/mkvtoolnix-gui/app.cpp @@ -12,7 +12,6 @@ #include "common/fs_sys_helpers.h" #include "common/iso639.h" #include "common/qt.h" -#include "common/translation.h" #include "common/unique_numbers.h" #include "common/version.h" #include "mkvtoolnix-gui/app.h" @@ -254,47 +253,31 @@ App::isInstalled() { void App::initializeLocale(QString const &requestedLocale) { - auto locale = to_utf8(requestedLocale); + auto locale = Util::Settings::get().localeToUse(requestedLocale); #if defined(HAVE_LIBINTL_H) - auto &cfg = Util::Settings::get(); + if (!locale.isEmpty()) { + if (m_currentTranslator) + removeTranslator(m_currentTranslator.get()); + m_currentTranslator.reset(); - if (m_currentTranslator) - removeTranslator(m_currentTranslator.get()); - m_currentTranslator.reset(); - - translation_c::initialize_available_translations(); - - if (locale.empty()) - locale = to_utf8(cfg.m_uiLocale); - - if (-1 == translation_c::look_up_translation(locale)) - locale = ""; - - if (locale.empty()) { - locale = boost::regex_replace(translation_c::get_default_ui_locale(), boost::regex{"\\..*", boost::regex::perl}, ""); - if (-1 == translation_c::look_up_translation(locale)) - locale = ""; - } - - if (!locale.empty()) { auto translator = std::make_unique(); - auto paths = QStringList{} << Q("%1/locale/%2/LC_MESSAGES").arg(applicationDirPath()).arg(Q(locale)) + auto paths = QStringList{} << Q("%1/locale/%2/LC_MESSAGES").arg(applicationDirPath()).arg(locale) << QLibraryInfo::location(QLibraryInfo::TranslationsPath); for (auto const &path : paths) - if (translator->load(Q("qtbase_%1").arg(Q(locale)), path)) + if (translator->load(Q("qtbase_%1").arg(locale), path)) break; installTranslator(translator.get()); - m_currentTranslator = std::move(translator); - cfg.m_uiLocale = Q(locale); + m_currentTranslator = std::move(translator); + Util::Settings::get().m_uiLocale = locale; } #endif // HAVE_LIBINTL_H - init_locales(locale); + init_locales(to_utf8(locale)); retranslateUi(); } diff --git a/src/mkvtoolnix-gui/merge/mux_config.cpp b/src/mkvtoolnix-gui/merge/mux_config.cpp index a5225d075..d1e5dedf7 100644 --- a/src/mkvtoolnix-gui/merge/mux_config.cpp +++ b/src/mkvtoolnix-gui/merge/mux_config.cpp @@ -395,8 +395,10 @@ MuxConfig::buildMkvmergeOptions() auto options = QStringList{}; auto &settings = Util::Settings::get(); + auto locale = settings.localeToUse(); - options << Q("--ui-language") << settings.m_uiLocale; + if (!locale.isEmpty()) + options << Q("--ui-language") << locale; if (Util::Settings::NormalPriority != settings.m_priority) options << Q("--priority") << settings.priorityAsString(); diff --git a/src/mkvtoolnix-gui/util/settings.cpp b/src/mkvtoolnix-gui/util/settings.cpp index 5e685a9e2..3aaebe6df 100644 --- a/src/mkvtoolnix-gui/util/settings.cpp +++ b/src/mkvtoolnix-gui/util/settings.cpp @@ -396,4 +396,27 @@ Settings::storeSplitterSizes() { qDebug() << "storeSplitterSize() signal from non-splitter" << sender() << sender()->objectName(); } +QString +Settings::localeToUse(QString const &requestedLocale) { + auto locale = to_utf8(requestedLocale); + +#if defined(HAVE_LIBINTL_H) + translation_c::initialize_available_translations(); + + if (locale.empty()) + locale = to_utf8(m_uiLocale); + + if (-1 == translation_c::look_up_translation(locale)) + locale = ""; + + if (locale.empty()) { + locale = boost::regex_replace(translation_c::get_default_ui_locale(), boost::regex{"\\..*", boost::regex::perl}, ""); + if (-1 == translation_c::look_up_translation(locale)) + locale = ""; + } +#endif + + return to_qs(locale); +} + }}} diff --git a/src/mkvtoolnix-gui/util/settings.h b/src/mkvtoolnix-gui/util/settings.h index bd19261ec..e865e5f8d 100644 --- a/src/mkvtoolnix-gui/util/settings.h +++ b/src/mkvtoolnix-gui/util/settings.h @@ -9,6 +9,8 @@ #include #include +#include "common/translation.h" + class QSettings; class QSplitter; @@ -106,6 +108,8 @@ public: void handleSplitterSizes(QSplitter *splitter); void restoreSplitterSizes(QSplitter *splitter); + QString localeToUse(QString const &requestedLocale = {}); + public slots: void storeSplitterSizes();