Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include <linguistproject/profileutils.h>
5#include <linguistproject/projsongenerator.h>
6#include <linguistproject/projectdescriptionreader.h>
7#include <linguistproject/projectprocessor.h>
8#include <trlib/trparser.h>
9
10#include <QtCore/qcoreapplication.h>
11#include <QtCore/qdebug.h>
12#include <QtCore/qdir.h>
13#include <QtCore/qfile.h>
14#include <QtCore/qfileinfo.h>
15#include <QtCore/qlibraryinfo.h>
16#include <QtCore/qstring.h>
17#include <QtCore/qstringlist.h>
18#include <QtCore/qtemporaryfile.h>
19#include <QtCore/qtranslator.h>
20
21#include <iostream>
22
23using namespace Qt::StringLiterals;
24
25static void printOut(const QString & out)
26{
27 std::cout << qPrintable(out);
28}
29
30static void printErr(const QString & out)
31{
32 std::cerr << qPrintable(out);
33}
34
35static void printUsage()
36{
37 printOut(uR"(Usage:
38lupdate-pro [options] [project-file]... [-ts ts-files...]
39lupdate-pro is part of Qt's Linguist tool chain. It extracts project
40information from qmake projects and passes it to lupdate.
41All command line options that are not consumed by lupdate-pro are
42passed to lupdate.
43
44Options:
45 -help Display this information and exit.
46 -silent
47 Do not explain what is being done.
48 -pro <filename>
49 Name of a .pro file. Useful for files with .pro file syntax but
50 different file suffix. Projects are recursed into and merged.
51 -dump-json <file>
52 Only generate the project description json file.
53 -pro-out <directory>
54 Virtual output directory for processing subsequent .pro files.
55 -pro-debug
56 Trace processing .pro files. Specify twice for more verbosity.
57 -version
58 Display the version of lupdate-pro and exit.
59)"_s);
60}
61
62int main(int argc, char **argv)
63{
64 QCoreApplication app(argc, argv);
65#ifndef QT_BOOTSTRAPPED
66#ifndef Q_OS_WIN32
67 QTranslator translator;
68 QTranslator qtTranslator;
69 QString sysLocale = QLocale::system().name();
70 QString resourceDir = QLibraryInfo::path(QLibraryInfo::TranslationsPath);
71 if (translator.load("linguist_"_L1 + sysLocale, resourceDir)
72 && qtTranslator.load("qt_"_L1 + sysLocale, resourceDir)) {
73 app.installTranslator(&translator);
74 app.installTranslator(&qtTranslator);
75 }
76#endif // Q_OS_WIN32
77#endif
78
79 QStringList args = app.arguments();
80 std::optional<QString> dumpJsonFile;
81
82 QStringList proFiles;
83 QString outDir = QDir::currentPath();
84 QHash<QString, QString> outDirMap;
85 int proDebug = 0;
86 bool verbose = true;
87
88 QStringList tsFileNames;
89 QStringList alienFiles;
90 QString sourceLanguage;
91 QString targetLanguage;
92 UpdateOptions options = Verbose | // verbose is on by default starting with Qt 4.2
94
95 for (int i = 1; i < args.size(); ++i) {
96 QString arg = args.at(i);
97 if (arg == "-help"_L1 || arg == "--help"_L1 || arg == "-h"_L1) {
99 return 0;
100 } else if (arg == "-dump-json"_L1) {
101 ++i;
102 if (i == argc) {
103 printErr(u"The -dump-json option should be followed by a file name.\n"_s);
104 return 1;
105 }
106 dumpJsonFile.emplace(QFileInfo(args[i]).absoluteFilePath());
107 } else if (arg == "-silent"_L1) {
108 verbose = false;
109 options &= ~Verbose;
110 } else if (arg == "-verbose"_L1) {
111 options |= Verbose;
112 } else if (arg == "-pro-debug"_L1) {
113 proDebug++;
114 } else if (arg == "-version"_L1) {
115 printOut(QStringLiteral("lupdate-pro version %1\n").arg(QLatin1String(QT_VERSION_STR)));
116 return 0;
117 } else if (arg == "-pro"_L1) {
118 ++i;
119 if (i == argc) {
120 printErr(u"The -pro option should be followed by a filename of .pro file.\n"_s);
121 return 1;
122 }
123 QString file = QDir::cleanPath(QFileInfo(args[i]).absoluteFilePath());
124 proFiles += file;
125 outDirMap[file] = outDir;
126 } else if (arg == "-pro-out"_L1) {
127 ++i;
128 if (i == argc) {
129 printErr(u"The -pro-out option should be followed by a directory name.\n"_s);
130 return 1;
131 }
132 outDir = QDir::cleanPath(QFileInfo(args[i]).absoluteFilePath());
133 } else if (arg == "-ts"_L1) {
134 ++i;
135 while (i < args.size() && !args.at(i).startsWith('-'_L1)) {
136 tsFileNames << args.at(i);
137 ++i;
138 }
139 --i;
140 } else if (arg == "-target-language"_L1) {
141 ++i;
142 if (i < args.size())
143 targetLanguage = args.at(i);
144 } else if (arg == "-source-language"_L1) {
145 ++i;
146 if (i < args.size())
147 sourceLanguage = args.at(i);
148 } else if (arg == "-no-obsolete"_L1 || arg == "-noobsolete"_L1) {
149 options |= NoObsolete;
150 } else if (arg == "-plural-only"_L1) {
151 options |= PluralOnly;
152 } else if (arg == "-no-sort"_L1 || arg == "-nosort"_L1) {
153 options |= NoSort;
154 } else if (arg == "-locations"_L1) {
155 ++i;
156 if (i < args.size()) {
157 if (args.at(i) == "none"_L1)
158 options |= NoLocations;
159 else if (args.at(i) == "relative"_L1)
160 options |= RelativeLocations;
161 else if (args.at(i) == "absolute"_L1)
162 options |= AbsoluteLocations;
163 }
164 } else if (arg == "-no-ui-lines"_L1) {
165 options |= NoUiLines;
166 } else if (arg == "-tr-function-alias"_L1) {
167 ++i;
168 if (i == argc) {
169 printErr(u"The -tr-function-alias option should be "
170 "followed by a list of function=alias mappings.\n"_s);
171 return 1;
172 }
173 if (!parseTrFunctionAliasString(args[i]))
174 return 1;
175 } else if (isProOrPriFile(arg)) {
176 QString cleanFile = QDir::cleanPath(QFileInfo(arg).absoluteFilePath());
177 proFiles << cleanFile;
178 outDirMap[cleanFile] = outDir;
179 }
180 } // for args
181
182 if (proFiles.isEmpty()) {
183 printErr(u"lupdate-pro: No .pro/.pri files given.\n"_s);
184 return 1;
185 }
186
187 QStringList translationsVariables = { "TRANSLATIONS"_L1 };
188 QString errorString;
189 QJsonArray results;
190 Projects projectDescription = generateProjects(proFiles, translationsVariables, outDirMap,
191 proDebug, verbose, &errorString, &results);
192
193 if (dumpJsonFile) {
194 QFile projectDescriptionFile(*dumpJsonFile);
195 if (!projectDescriptionFile.open(QIODevice::WriteOnly))
196 return 1;
197
198 const QByteArray output = QJsonDocument(results).toJson(QJsonDocument::Compact);
199 projectDescriptionFile.write(output);
200 projectDescriptionFile.write("\n");
201 projectDescriptionFile.close();
202 printOut("Project description saved to: %1\n"_L1.arg(projectDescriptionFile.fileName()));
203 return 0;
204 }
205
206 if (!errorString.isEmpty()) {
207 printErr("lupdate-pro error: %1\n"_L1.arg(errorString));
208 return 1;
209 }
210 if (projectDescription.empty()) {
211 printErr("lupdate-pro error: No projects found in project description\n"_L1);
212 return 1;
213 }
214
215 bool ok = processProjectDescription(projectDescription, tsFileNames, alienFiles, sourceLanguage,
216 targetLanguage, options);
217 return ok ? 0 : 1;
218}
std::vector< Project > Projects
static void printOut(const QString &out)
Definition main.cpp:22
static void printErr(const QString &out)
Definition main.cpp:16
static void printUsage()
Definition main.cpp:24
int main(int argc, char *argv[])
[ctor_close]
@ NoLocations
Definition trparser.h:23
@ Verbose
Definition trparser.h:15
@ NoObsolete
Definition trparser.h:16
@ PluralOnly
Definition trparser.h:17
@ NoSort
Definition trparser.h:18
@ HeuristicSimilarText
Definition trparser.h:20
@ HeuristicSameText
Definition trparser.h:19
@ AbsoluteLocations
Definition trparser.h:21
@ RelativeLocations
Definition trparser.h:22
@ NoUiLines
Definition trparser.h:24