Fix crash when default locale is ru.

Additionally fix a common antipattern when loading translations in Qt.
This commit is contained in:
Roman Telezhynskyi 2022-04-22 12:42:46 +03:00
parent 7d45ca1447
commit 7c1c6deeae
7 changed files with 65 additions and 27 deletions

View File

@ -1,3 +1,6 @@
# Valentina 0.7.52 (unreleased)
- Fix crash when default locale is ru.
# Valentina 0.7.51 April 18, 2022 # Valentina 0.7.51 April 18, 2022
- Z value change for a layout piece. - Z value change for a layout piece.
- Fix issue with Custom template. - Fix issue with Custom template.

View File

@ -399,7 +399,7 @@ void VPApplication::InitOptions()
QPixmapCache::setCacheLimit(50 * 1024 /* 50 MB */); QPixmapCache::setCacheLimit(50 * 1024 /* 50 MB */);
LoadTranslation(QLocale().name());// By default the console version uses system locale LoadTranslation(QString());// By default the console version uses system locale
VPCommandLine::Instance(); VPCommandLine::Instance();

View File

@ -423,7 +423,7 @@ void MApplication::InitOptions()
qCDebug(mApp, "Command-line arguments: %s", qUtf8Printable(arguments().join(", "))); qCDebug(mApp, "Command-line arguments: %s", qUtf8Printable(arguments().join(", ")));
qCDebug(mApp, "Process ID: %s", qUtf8Printable(QString().setNum(applicationPid()))); qCDebug(mApp, "Process ID: %s", qUtf8Printable(QString().setNum(applicationPid())));
LoadTranslation(QLocale().name());// By default the console version uses system locale LoadTranslation(QString());// By default the console version uses system locale
static const char * GENERIC_ICON_TO_CHECK = "document-open"; static const char * GENERIC_ICON_TO_CHECK = "document-open";
if (QIcon::hasThemeIcon(GENERIC_ICON_TO_CHECK) == false) if (QIcon::hasThemeIcon(GENERIC_ICON_TO_CHECK) == false)

View File

@ -617,7 +617,7 @@ void VApplication::InitOptions()
qDebug()<<"Command-line arguments:"<<arguments(); qDebug()<<"Command-line arguments:"<<arguments();
qDebug()<<"Process ID:"<<applicationPid(); qDebug()<<"Process ID:"<<applicationPid();
LoadTranslation(QLocale().name());// By default the console version uses system locale LoadTranslation(QString());// By default the console version uses system locale
// Create command line parser after loading translations to show localized version. // Create command line parser after loading translations to show localized version.
VCommandLine::Get(*this); VCommandLine::Get(*this);

View File

@ -473,7 +473,7 @@ void InitLanguages(QComboBox *combobox)
combobox->clear(); combobox->clear();
QStringList fileNames; QStringList fileNames;
QDirIterator it(VAbstractApplication::VApp()->translationsPath(), QStringList("valentina_*.qm"), QDir::Files, QDirIterator it(VAbstractApplication::translationsPath(), QStringList("valentina_*.qm"), QDir::Files,
QDirIterator::Subdirectories); QDirIterator::Subdirectories);
while (it.hasNext()) while (it.hasNext())
{ {

View File

@ -50,6 +50,50 @@
# include "appimage.h" # include "appimage.h"
#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) #endif // defined(APPIMAGE) && defined(Q_OS_LINUX)
namespace
{
auto FilterLocales(const QStringList &locales) -> QStringList
{
QStringList filtered;
for (const auto &locale : locales)
{
if (not locale.startsWith(QLatin1String("ru")))
{
filtered.append(locale);
}
}
return filtered;
}
//---------------------------------------------------------------------------------------------------------------------
auto LoadQM(QTranslator *translator, const QString &filename, const QString &locale, const QString &qmDir) -> bool
{
QStringList languages;
if (not locale.isEmpty())
{
languages.append(locale);
}
else
{
languages = QLocale().uiLanguages();
}
languages = FilterLocales(languages);
for (auto &locale : languages)
{
const bool loaded = translator->load(filename + locale, qmDir);
if (loaded)
{
return loaded;
}
}
return false;
}
} // namespace
const QString VAbstractApplication::warningMessageSignature = QStringLiteral("[PATTERN MESSAGE]"); const QString VAbstractApplication::warningMessageSignature = QStringLiteral("[PATTERN MESSAGE]");
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -109,7 +153,7 @@ VAbstractApplication::VAbstractApplication(int &argc, char **argv)
* subdirectory inside an app bundle. * subdirectory inside an app bundle.
* @return path to a directory that contain QM files. * @return path to a directory that contain QM files.
*/ */
QString VAbstractApplication::translationsPath(const QString &locale) const auto VAbstractApplication::translationsPath(const QString &locale) -> QString
{ {
const QString trPath = QStringLiteral("/translations"); const QString trPath = QStringLiteral("/translations");
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -201,51 +245,42 @@ void VAbstractApplication::LoadTranslation(const QString &locale)
{ {
if (locale.isEmpty()) if (locale.isEmpty())
{ {
qDebug()<<"Locale is empty."; qDebug()<<"Default locale";
return;
} }
else
if (locale.startsWith(QLatin1String("ru")))
{ {
return;
}
qDebug()<<"Checked locale:"<<locale; qDebug()<<"Checked locale:"<<locale;
}
ClearTranslation(); ClearTranslation();
const QString appQmDir = VAbstractApplication::translationsPath(locale);
qtTranslator = new QTranslator(this); qtTranslator = new QTranslator(this);
#if defined(Q_OS_WIN) || defined(Q_OS_MAC) #if defined(Q_OS_WIN) || defined(Q_OS_MAC)
qtTranslator->load("qt_" + locale, translationsPath(locale)); const QString qtQmDir = appQmDir;
#else #else
qtTranslator->load("qt_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); const QString qtQmDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
#endif #endif
LoadQM(qtTranslator, QStringLiteral("qt_"), locale, qtQmDir);
installTranslator(qtTranslator); installTranslator(qtTranslator);
qtxmlTranslator = new QTranslator(this); qtxmlTranslator = new QTranslator(this);
#if defined(Q_OS_WIN) || defined(Q_OS_MAC) LoadQM(qtxmlTranslator, QStringLiteral("qtxmlpatterns_"), locale, qtQmDir);
qtxmlTranslator->load("qtxmlpatterns_" + locale, translationsPath(locale));
#else
qtxmlTranslator->load("qtxmlpatterns_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
#endif
installTranslator(qtxmlTranslator); installTranslator(qtxmlTranslator);
qtBaseTranslator = new QTranslator(this); qtBaseTranslator = new QTranslator(this);
#if defined(Q_OS_WIN) || defined(Q_OS_MAC) LoadQM(qtBaseTranslator, QStringLiteral("qtbase_"), locale, qtQmDir);
qtBaseTranslator->load("qtbase_" + locale, translationsPath(locale));
#else
qtBaseTranslator->load("qtbase_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
#endif
installTranslator(qtBaseTranslator); installTranslator(qtBaseTranslator);
appTranslator = new QTranslator(this); appTranslator = new QTranslator(this);
appTranslator->load("valentina_" + locale, translationsPath(locale)); LoadQM(appTranslator, QStringLiteral("valentina_"), locale, appQmDir);
installTranslator(appTranslator); installTranslator(appTranslator);
const QString system = Settings()->GetPMSystemCode(); const QString system = Settings()->GetPMSystemCode();
pmsTranslator = new QTranslator(this); pmsTranslator = new QTranslator(this);
pmsTranslator->load("measurements_" + system + "_" + locale, translationsPath(locale)); LoadQM(pmsTranslator, QStringLiteral("measurements_") + Settings()->GetPMSystemCode() + '_', locale, appQmDir);
installTranslator(pmsTranslator); installTranslator(pmsTranslator);
InitTrVars();//Very important do it after load QM files. InitTrVars();//Very important do it after load QM files.

View File

@ -62,7 +62,7 @@ public:
virtual const VTranslateVars *TrVars()=0; virtual const VTranslateVars *TrVars()=0;
QString translationsPath(const QString &locale = QString()) const; static QString translationsPath(const QString &locale = QString());
void LoadTranslation(const QString &locale); void LoadTranslation(const QString &locale);