1/****************************************************************************
2**
3** Copyright (C) 2018 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Linguist of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29#include <profileutils.h>
30#include <runqttool.h>
31
32#include <QtCore/qcoreapplication.h>
33#include <QtCore/qdebug.h>
34#include <QtCore/qlibraryinfo.h>
35#include <QtCore/qtranslator.h>
36
37#include <iostream>
38
39QT_USE_NAMESPACE
40
41#ifdef QT_BOOTSTRAPPED
42struct LR {
43 static inline QString tr(const char *sourceText, const char *comment = 0)
44 {
45 return QCoreApplication::translate("LRelease", sourceText, comment);
46 }
47};
48#else
49class LR {
50 Q_DECLARE_TR_FUNCTIONS(LRelease)
51};
52#endif
53
54static void printOut(const QString &out)
55{
56 std::cout << qPrintable(out);
57}
58
59static void printErr(const QString &out)
60{
61 std::cerr << qPrintable(out);
62}
63
64static void printUsage()
65{
66 printOut(out: LR::tr(
67 sourceText: "Usage:\n"
68 " lrelease-pro [options] [project-file]...\n"
69 "lrelease-pro is part of Qt's Linguist tool chain. It extracts project\n"
70 "information from qmake projects and passes it to lrelease.\n"
71 "All command line options that are not consumed by lrelease-pro are\n"
72 "passed to lrelease.\n\n"
73 "Options:\n"
74 " -help Display this information and exit\n"
75 " -keep Keep the temporary project dump around\n"
76 " -silent\n"
77 " Do not explain what is being done\n"
78 " -version\n"
79 " Display the version of lrelease-pro and exit\n"
80 ));
81}
82
83int main(int argc, char **argv)
84{
85 QCoreApplication app(argc, argv);
86#ifndef QT_BOOTSTRAPPED
87#ifndef Q_OS_WIN32
88 QTranslator translator;
89 QTranslator qtTranslator;
90 QString sysLocale = QLocale::system().name();
91 QString resourceDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
92 if (translator.load(filename: QLatin1String("linguist_") + sysLocale, directory: resourceDir)
93 && qtTranslator.load(filename: QLatin1String("qt_") + sysLocale, directory: resourceDir)) {
94 app.installTranslator(messageFile: &translator);
95 app.installTranslator(messageFile: &qtTranslator);
96 }
97#endif // Q_OS_WIN32
98#endif // QT_BOOTSTRAPPED
99
100 bool keepProjectDescription = false;
101 QStringList inputFiles;
102 QStringList lprodumpOptions;
103 QStringList lreleaseOptions;
104
105 for (int i = 1; i < argc; ++i) {
106 if (!strcmp(s1: argv[i], s2: "-keep")) {
107 keepProjectDescription = true;
108 } else if (!strcmp(s1: argv[i], s2: "-silent")) {
109 const QString arg = QString::fromLocal8Bit(str: argv[i]);
110 lprodumpOptions << arg;
111 lreleaseOptions << arg;
112 } else if (!strcmp(s1: argv[i], s2: "-version")) {
113 printOut(out: LR::tr(sourceText: "lrelease-pro version %1\n").arg(a: QLatin1String(QT_VERSION_STR)));
114 return 0;
115 } else if (!strcmp(s1: argv[i], s2: "-help")) {
116 printUsage();
117 return 0;
118 } else if (strlen(s: argv[i]) > 0 && argv[i][0] == '-') {
119 lreleaseOptions << QString::fromLocal8Bit(str: argv[i]);
120 } else {
121 inputFiles << QString::fromLocal8Bit(str: argv[i]);
122 }
123 }
124
125 if (inputFiles.isEmpty()) {
126 printUsage();
127 return 1;
128 }
129
130 const QStringList proFiles = extractProFiles(files: &inputFiles);
131 if (proFiles.isEmpty()) {
132 printErr(out: LR::tr(sourceText: "lrelease-pro: No .pro/.pri files given.\n"));
133 return 1;
134 }
135 if (!inputFiles.isEmpty()) {
136 printErr(out: LR::tr(sourceText: "lrelease-pro: Only .pro/.pri files are supported. "
137 "Offending files:\n %1\n")
138 .arg(a: inputFiles.join(sep: QLatin1String("\n "))));
139 return 1;
140 }
141
142 lprodumpOptions << proFiles;
143 std::unique_ptr<QTemporaryFile> projectDescription = createProjectDescription(args: lprodumpOptions);
144 if (keepProjectDescription)
145 projectDescription->setAutoRemove(false);
146 lreleaseOptions << QStringLiteral("-project") << projectDescription->fileName();
147
148 runQtTool(QStringLiteral("lrelease"), arguments: lreleaseOptions);
149 return 0;
150}
151

source code of qttools/src/linguist/lrelease-pro/main.cpp