Do not bundle translations with a binary, package them to system dir and use %lang tagging in package. some paths debug: qWarning() << "language: " << language; qWarning() << "qtpath: " << QLibraryInfo::location(QLibraryInfo::TranslationsPath); qWarning() << "apppath: " << a.applicationDirPath(); qWarning() << "curdir: " << QDir::currentPath(); TODO: add install target TODO: make it configurable via cmake params. Author: Elan Ruusamäe --- clementine-1.3.1/src/main.cpp.orig 2016-04-19 17:43:09.000000000 +0200 +++ clementine-1.3.1/src/main.cpp 2022-07-09 07:56:27.319171455 +0200 @@ -396,7 +396,6 @@ int main(int argc, char* argv[]) { // Resources Q_INIT_RESOURCE(data); - Q_INIT_RESOURCE(translations); // Add root CA cert for SoundCloud, whose certificate is missing on OS X. QSslSocket::addDefaultCaCertificates( @@ -417,10 +416,15 @@ int main(int argc, char* argv[]) { : override_language; // Translations - LoadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), - language); + // Qt: system path + LoadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), language); + // Clementine: system path + LoadTranslation("clementine", QLibraryInfo::location(QLibraryInfo::TranslationsPath), language); + // Clementine: QRC LoadTranslation("clementine", ":/translations", language); + // Clementine: application path LoadTranslation("clementine", a.applicationDirPath(), language); + // Clementine: current dir LoadTranslation("clementine", QDir::currentPath(), language); #ifdef Q_OS_WIN32 --- clementine-1.3.1/src/ui/behavioursettingspage.cpp.orig 2015-12-15 13:13:23.000000000 +0100 +++ clementine-1.3.1/src/ui/behavioursettingspage.cpp 2022-07-09 07:58:06.261968769 +0200 @@ -23,6 +23,7 @@ #include "playlist/playlisttabbar.h" #include +#include namespace { bool LocaleAwareCompare(const QString& a, const QString& b) { @@ -59,16 +60,15 @@ BehaviourSettingsPage::BehaviourSettings ui_->menu_previousmode->setItemData(0, Player::PreviousBehaviour_DontRestart); ui_->menu_previousmode->setItemData(1, Player::PreviousBehaviour_Restart); - // Populate the language combo box. We do this by looking at all the - // compiled in translations. - QDir dir(":/translations/"); - QStringList codes(dir.entryList(QStringList() << "*.qm")); - QRegExp lang_re("^clementine_(.*).qm$"); - for (const QString& filename : codes) { - // The regex captures the "ru" from "clementine_ru.qm" - if (!lang_re.exactMatch(filename)) continue; + // Populate the language combo box + // We do this by looking at all the compiled in translations. + QDir localeDir(QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + QStringList dirList = localeDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); + foreach (const QString& code, dirList) { + if (!QFile::exists(QLibraryInfo::location(QLibraryInfo::TranslationsPath) + "/" + code + "/LC_MESSAGES/clementine.qm")) { + continue; + } - QString code = lang_re.cap(1); QString lookup_code = QString(code) .replace("@latin", "_Latn") .replace("_CN", "_Hans_CN") --- clementine-0.5.3/cmake/Translations.cmake 2010-10-18 23:59:53.487509786 +0300 +++ clementine-0.5.3/cmake/Translations.cmake 2010-10-19 01:42:52.112825900 +0300 @@ -65,10 +65,22 @@ - # Generate a qrc file for the translations - set(_qrc ${CMAKE_CURRENT_BINARY_DIR}/${ADD_PO_DIRECTORY}/translations.qrc) - file(WRITE ${_qrc} "") - foreach(_lang ${ADD_PO_LANGUAGES}) - file(APPEND ${_qrc} "${po_prefix}${_lang}.qm") - endforeach(_lang) - file(APPEND ${_qrc} "") - qt4_add_resources(${outfiles} ${_qrc}) + # install .qm + set(_potBasename "clementine") + foreach (_lang ${ADD_PO_LANGUAGES}) + set(_qm_filename "clementine_${_lang}.qm") + set(_qm_filepath "${CMAKE_CURRENT_BINARY_DIR}/${ADD_PO_DIRECTORY}/${_qm_filename}") + + install(FILES ${_qm_filepath} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.qm) + set(_gmoFiles ${_gmoFiles} ${_gmoFile}) + endforeach (_lang) + + add_custom_target(translations ALL DEPENDS ${_gmoFiles}) + +# # Generate a qrc file for the translations +# set(_qrc ${CMAKE_CURRENT_BINARY_DIR}/${ADD_PO_DIRECTORY}/translations.qrc) +# file(WRITE ${_qrc} "") +# foreach(_lang ${ADD_PO_LANGUAGES}) +# file(APPEND ${_qrc} "${po_prefix}${_lang}.qm") +# endforeach(_lang) +# file(APPEND ${_qrc} "") +# qt4_add_resources(${outfiles} ${_qrc}) endmacro(add_po) --- clementine-1.1.1/tests/resources_env.h~ 2013-09-08 01:29:59.000000000 +0300 +++ clementine-1.1.1/tests/resources_env.h 2013-09-08 01:30:00.886424405 +0300 @@ -26,7 +26,7 @@ public: void SetUp() { Q_INIT_RESOURCE(data); - Q_INIT_RESOURCE(translations); +// Q_INIT_RESOURCE(translations); Q_INIT_RESOURCE(testdata); } }; --- clementine-1.1.1/tests/translations_test.cpp~ 2013-09-08 01:34:17.000000000 +0300 +++ clementine-1.1.1/tests/translations_test.cpp 2013-09-08 01:34:21.084475375 +0300 @@ -23,14 +23,14 @@ #include "test_utils.h" TEST(Translations, Basic) { - ASSERT_TRUE(QFile::exists(":/translations")); - ASSERT_TRUE(QFile::exists(":/translations/clementine_es.qm")); +// ASSERT_TRUE(QFile::exists(":/translations")); +// ASSERT_TRUE(QFile::exists(":/translations/clementine_es.qm")); PoTranslator t; t.load("clementine_es.qm", ":/translations"); - EXPECT_EQ(QString::fromUtf8("Colección"), - t.translate("MainWindow", "Library")); - EXPECT_EQ(QString::fromUtf8("Colección"), - t.translate("", "Library")); +// EXPECT_EQ(QString::fromUtf8("Colección"), +// t.translate("MainWindow", "Library")); +// EXPECT_EQ(QString::fromUtf8("Colección"), +// t.translate("", "Library")); }