From 3a1d5ed533af027942e75e387acb8c853353d38e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Aug 2017 12:56:34 -0400 Subject: [PATCH] Python-i18n: (inefficiently) search for suitable gettext dirs --- src/libcalamares/PythonJobApi.cpp | 51 +++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index d7d78c9ce..91b364c77 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -27,7 +27,9 @@ #include "GlobalStorage.h" #include "JobQueue.h" +#include #include +#include #undef slots #include @@ -203,10 +205,10 @@ obscure( const std::string& string ) return CalamaresUtils::obscure( QString::fromStdString( string ) ).toStdString(); } -bp::list -gettext_languages() +static QStringList +_gettext_languages() { - bp::list pyList; + QStringList languages; // There are two ways that Python jobs can be initialised: // - through JobQueue, in which case that has an instance which holds @@ -224,27 +226,64 @@ gettext_languages() if ( lang_.canConvert< QString >() ) { QString lang = lang_.value< QString >(); - pyList.append( lang.toStdString() ); + languages.append(lang); if ( lang.indexOf( '.' ) > 0) { lang.truncate( lang.indexOf( '.' ) ); - pyList.append( lang.toStdString() ); + languages.append(lang); } if ( lang.indexOf( '_' ) > 0) { lang.truncate( lang.indexOf( '_' ) ); - pyList.append( lang.toStdString() ); + languages.append(lang); } } } + return languages; +} + +bp::list +gettext_languages() +{ + bp::list pyList; + for (auto lang : _gettext_languages()) + pyList.append( lang.toStdString() ); return pyList; } +static void +_add_localedirs(QStringList &pathList, const QString &candidate) +{ + if (!candidate.isEmpty()) + { + pathList.prepend(candidate); + if (QDir(candidate).cd("lang")) + { + pathList.prepend(candidate + "/lang"); + } + } +} + bp::object gettext_path() { // TODO: distinguish between -d runs and normal runs // TODO: can we detect DESTDIR-installs? + QStringList candidatePaths = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "locale", QStandardPaths::LocateDirectory); + QString extra = QCoreApplication::applicationDirPath(); + _add_localedirs(candidatePaths, extra); + _add_localedirs(candidatePaths, QDir().canonicalPath()); + + cDebug() << "Standard paths" << candidatePaths; + + for (auto lang : _gettext_languages()) + for (auto localedir : candidatePaths) + { + QDir ldir(localedir); + cDebug() << "Checking" << lang << "in" <