Fix crash when default locale is ru.
Additionally fix a common antipattern when loading translations in Qt.
This commit is contained in:
parent
7d45ca1447
commit
7c1c6deeae
|
@ -1,3 +1,6 @@
|
|||
# Valentina 0.7.52 (unreleased)
|
||||
- Fix crash when default locale is ru.
|
||||
|
||||
# Valentina 0.7.51 April 18, 2022
|
||||
- Z value change for a layout piece.
|
||||
- Fix issue with Custom template.
|
||||
|
|
|
@ -399,7 +399,7 @@ void VPApplication::InitOptions()
|
|||
|
||||
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();
|
||||
|
||||
|
|
|
@ -423,7 +423,7 @@ void MApplication::InitOptions()
|
|||
qCDebug(mApp, "Command-line arguments: %s", qUtf8Printable(arguments().join(", ")));
|
||||
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";
|
||||
if (QIcon::hasThemeIcon(GENERIC_ICON_TO_CHECK) == false)
|
||||
|
|
|
@ -617,7 +617,7 @@ void VApplication::InitOptions()
|
|||
qDebug()<<"Command-line arguments:"<<arguments();
|
||||
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.
|
||||
VCommandLine::Get(*this);
|
||||
|
|
|
@ -473,7 +473,7 @@ void InitLanguages(QComboBox *combobox)
|
|||
combobox->clear();
|
||||
|
||||
QStringList fileNames;
|
||||
QDirIterator it(VAbstractApplication::VApp()->translationsPath(), QStringList("valentina_*.qm"), QDir::Files,
|
||||
QDirIterator it(VAbstractApplication::translationsPath(), QStringList("valentina_*.qm"), QDir::Files,
|
||||
QDirIterator::Subdirectories);
|
||||
while (it.hasNext())
|
||||
{
|
||||
|
|
|
@ -50,6 +50,50 @@
|
|||
# include "appimage.h"
|
||||
#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]");
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -109,7 +153,7 @@ VAbstractApplication::VAbstractApplication(int &argc, char **argv)
|
|||
* subdirectory inside an app bundle.
|
||||
* @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");
|
||||
#ifdef Q_OS_WIN
|
||||
|
@ -201,51 +245,42 @@ void VAbstractApplication::LoadTranslation(const QString &locale)
|
|||
{
|
||||
if (locale.isEmpty())
|
||||
{
|
||||
qDebug()<<"Locale is empty.";
|
||||
return;
|
||||
qDebug()<<"Default locale";
|
||||
}
|
||||
|
||||
if (locale.startsWith(QLatin1String("ru")))
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug()<<"Checked locale:"<<locale;
|
||||
}
|
||||
|
||||
ClearTranslation();
|
||||
|
||||
const QString appQmDir = VAbstractApplication::translationsPath(locale);
|
||||
|
||||
qtTranslator = new QTranslator(this);
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
|
||||
qtTranslator->load("qt_" + locale, translationsPath(locale));
|
||||
const QString qtQmDir = appQmDir;
|
||||
#else
|
||||
qtTranslator->load("qt_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
|
||||
const QString qtQmDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
|
||||
#endif
|
||||
LoadQM(qtTranslator, QStringLiteral("qt_"), locale, qtQmDir);
|
||||
installTranslator(qtTranslator);
|
||||
|
||||
qtxmlTranslator = new QTranslator(this);
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
|
||||
qtxmlTranslator->load("qtxmlpatterns_" + locale, translationsPath(locale));
|
||||
#else
|
||||
qtxmlTranslator->load("qtxmlpatterns_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
|
||||
#endif
|
||||
LoadQM(qtxmlTranslator, QStringLiteral("qtxmlpatterns_"), locale, qtQmDir);
|
||||
installTranslator(qtxmlTranslator);
|
||||
|
||||
qtBaseTranslator = new QTranslator(this);
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
|
||||
qtBaseTranslator->load("qtbase_" + locale, translationsPath(locale));
|
||||
#else
|
||||
qtBaseTranslator->load("qtbase_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
|
||||
#endif
|
||||
LoadQM(qtBaseTranslator, QStringLiteral("qtbase_"), locale, qtQmDir);
|
||||
installTranslator(qtBaseTranslator);
|
||||
|
||||
appTranslator = new QTranslator(this);
|
||||
appTranslator->load("valentina_" + locale, translationsPath(locale));
|
||||
LoadQM(appTranslator, QStringLiteral("valentina_"), locale, appQmDir);
|
||||
installTranslator(appTranslator);
|
||||
|
||||
const QString system = Settings()->GetPMSystemCode();
|
||||
|
||||
pmsTranslator = new QTranslator(this);
|
||||
pmsTranslator->load("measurements_" + system + "_" + locale, translationsPath(locale));
|
||||
LoadQM(pmsTranslator, QStringLiteral("measurements_") + Settings()->GetPMSystemCode() + '_', locale, appQmDir);
|
||||
installTranslator(pmsTranslator);
|
||||
|
||||
InitTrVars();//Very important do it after load QM files.
|
||||
|
|
|
@ -62,7 +62,7 @@ public:
|
|||
|
||||
virtual const VTranslateVars *TrVars()=0;
|
||||
|
||||
QString translationsPath(const QString &locale = QString()) const;
|
||||
static QString translationsPath(const QString &locale = QString());
|
||||
|
||||
void LoadTranslation(const QString &locale);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user