41 QFile file(translationsDir + QLatin1String(
"/catalogs.json"));
43 std::wcerr <<
"Trying to read translation catalogs from \""
44 << qUtf8Printable(file.fileName()) <<
"\".\n";
46 if (!file.open(QIODevice::ReadOnly)) {
47 *errorString = QLatin1String(
"Cannot open ") + file.fileName();
51 QJsonParseError jsonParseError;
52 QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &jsonParseError);
53 if (jsonParseError.error != QJsonParseError::NoError) {
54 *errorString = jsonParseError.errorString();
58 if (!document.isArray()) {
59 *errorString = QLatin1String(
"Expected an array as root element of ") + file.fileName();
63 TranslationCatalogs catalogs;
64 for (
const QJsonValueRef &item : document.array()) {
65 TranslationCatalog catalog;
66 catalog.name = item[QLatin1String(
"name")].toString();
67 catalog.repositories = toStringList(item[QLatin1String(
"repositories")].toArray());
68 catalog.modules = toStringList(item[QLatin1String(
"modules")].toArray());
70 std::wcerr <<
"Found catalog \"" << qUtf8Printable(catalog.name) <<
"\".\n";
71 catalogs.emplace_back(std::move(catalog));
80 if (!file.open(QIODevice::ReadOnly)) {
81 *errorString = QLatin1String(
"Cannot open ") + file.fileName();
85 QJsonParseError jsonParseError;
86 QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &jsonParseError);
87 if (jsonParseError.error != QJsonParseError::NoError) {
88 *errorString = jsonParseError.errorString();
92 if (!document.isObject()) {
93 *errorString = QLatin1String(
"Expected an object as root element of ") + file.fileName();
97 const QJsonObject obj = document.object();
99 module.name =
"Qt6"_L1 + obj[QLatin1String(
"name")].toString();
100 module.repository = obj[QLatin1String(
"repository")].toString();
101 module
.internal = obj[QLatin1String(
"internal")].toBool();
102 module.pluginTypes = toStringList(obj[QLatin1String(
"plugin_types")].toArray());
116 bool verbose, QString *errorString)
118 const TranslationCatalogs catalogs = readTranslationsCatalogs(translationsDir, verbose,
120 if (!errorString->isEmpty()) {
121 std::wcerr <<
"Warning: Translations will not be available due to the following error."
122 <<
std::endl << *errorString <<
std::endl;
123 errorString->clear();
125 std::unordered_map<QString, QString> moduleToCatalogMap;
126 std::unordered_map<QString, QString> repositoryToCatalogMap;
127 for (
const TranslationCatalog &catalog : catalogs) {
128 for (
const QString &module : catalog.modules) {
129 moduleToCatalogMap.insert(std::make_pair(module, catalog.name));
131 for (
const QString &repository : catalog.repositories) {
132 repositoryToCatalogMap.insert(std::make_pair(repository, catalog.name));
136 using F = QDirListing::IteratorFlag;
138 for (
const auto &dirEntry : QDirListing(modulesDir, {u"*.json"_s}, F::FilesOnly)) {
139 QtModule module = moduleFromJsonFile(dirEntry.filePath(), errorString);
140 if (!errorString->isEmpty())
142 if (module.internal && module.name.endsWith(QStringLiteral(
"Private")))
144 module.id = modules.size();
145 if (module.id == QtModule::InvalidId) {
146 *errorString =
"Internal Error: too many modules for ModuleBitset to hold."_L1;
151 auto it = moduleToCatalogMap.find(module.name);
152 if (it != moduleToCatalogMap.end())
153 module.translationCatalog = it->second;
155 if (module.translationCatalog.isEmpty()) {
156 auto it = repositoryToCatalogMap.find(module.repository);
157 if (it != repositoryToCatalogMap.end())
158 module.translationCatalog = it->second;
162 modules.emplace_back(std::move(module));