source: calamares/trunk/fuentes/lang/txload.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 14 months ago

sync with github

File size: 5.3 KB
RevLine 
[7538]1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2018, Adriaan de Groot <groot@kde.org>
4 *
5 *   Calamares is free software: you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation, either version 3 of the License, or
8 *   (at your option) any later version.
9 *
10 *   Calamares is distributed in the hope that it will be useful,
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 *   GNU General Public License for more details.
14 *
15 *   You should have received a copy of the GNU General Public License
16 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include <QCoreApplication>
20#include <QDebug>
21#include <QFile>
22#include <QList>
23
24#include <QDomDocument>
25
26bool load_file(const char* filename, QDomDocument& doc)
27{
28    QFile file(filename);
29    QString err;
30    int err_line, err_column;
31    if (!file.open(QIODevice::ReadOnly))
32    {
33        qDebug() << "Could not open" << filename;
34        return false;
35    }
36    QByteArray ba( file.read(1024 * 1024) );
37    qDebug() << "Read" << ba.length() << "bytes from" << filename;
38
39    if (!doc.setContent(ba, &err, &err_line, &err_column)) {
40        qDebug() << "Could not read" << filename << ':' << err_line << ':' << err_column << ' ' << err;
41        file.close();
42        return false;
43    }
44    file.close();
45
46    return true;
47}
48
49QDomElement find_context(QDomDocument& doc, const QString& name)
50{
51    QDomElement top = doc.documentElement();
52    QDomNode n = top.firstChild();
53    while (!n.isNull()) {
54        if (n.isElement()) {
55            QDomElement e = n.toElement();
56            if ( ( e.tagName() == "context" ) && ( e.firstChildElement( "name" ).text() == name ) )
57                return e;
58        }
59        n = n.nextSibling();
60    }
61
62    return QDomElement();
63}
64
65QDomElement find_message(QDomElement& context, const QString& source)
66{
67    QDomNode n = context.firstChild();
68    while (!n.isNull()) {
69        if (n.isElement()) {
70            QDomElement e = n.toElement();
71            if ( e.tagName() == "message" )
72            {
73                QString msource = e.firstChildElement( "source" ).text();
74                if ( msource == source )
75                    return e;
76            }
77        }
78        n = n.nextSibling();
79    }
80    return QDomElement();
81}
82
83bool merge_into(QDomElement& master, QDomElement& sub)
84{
85    QDomNode n = sub.firstChild();
86    while (!n.isNull()) {
87        if (n.isElement()) {
88            QDomElement e = n.toElement();
89            if ( e.tagName() == "message" )
90            {
91                QString source = e.firstChildElement( "source" ).text();
92                QString translation = e.firstChildElement( "translation" ).text();
93                QDomElement masterTranslation = find_message( master, source );
94                if ( masterTranslation.isNull() )
95                {
96                    qDebug() << "No master translation for" << source;
97                    return false;
98                }
99
100                QString msource = masterTranslation.firstChildElement( "source" ).text();
101                QString mtranslation = masterTranslation.firstChildElement( "translation" ).text();
102
103                if ( source != msource )
104                {
105                    qDebug() << "Mismatch for messages\n" << source << '\n' << msource;
106                    return false;
107                }
108                if ( !translation.isEmpty() && ( translation != mtranslation ) )
109                {
110                    qDebug() << "\n\n\nSource:" << source << "\nTL1:" << mtranslation << "\nTL2:" << translation;
111                }
112            }
113        }
114        n = n.nextSibling();
115    }
116
117    return true;
118}
119
120
121
122bool merge_into(QDomDocument& master, QDomElement& context)
123{
124    QDomElement name = context.firstChildElement( "name" );
125    if ( name.isNull() )
126        return false;
127
128    QString contextname = name.text();
129    QDomElement masterContext = find_context( master, contextname );
130    if ( masterContext.isNull() )
131    {
132        qDebug() << "Master document has no context" << contextname;
133        return false;
134    }
135
136    return merge_into( masterContext, context );
137}
138
139bool merge_into(QDomDocument& master, QDomDocument& sub)
140{
141    QDomElement top = sub.documentElement();
142    QDomNode n = top.firstChild();
143    while (!n.isNull()) {
144        if (n.isElement()) {
145            QDomElement e = n.toElement();
146            if ( e.tagName() == "context" )
147                if ( !merge_into( master, e ) )
148                    return false;
149        }
150        n = n.nextSibling();
151    }
152
153    return true;
154}
155
156int main(int argc, char** argv)
157{
158    QCoreApplication a(argc, argv);
159
160    if (argc < 2)
161        return 1;
162
163    QDomDocument doc("master");
164    if ( !load_file(argv[1], doc) )
165        return 1;
166
167    for (int i = 2; i < argc; ++i)
168    {
169        QDomDocument subdoc("sub");
170        if ( !load_file(argv[i], subdoc) )
171            return 1;
172        if ( !merge_into( doc, subdoc ) )
173            return 1;
174    }
175
176    QString outfilename( argv[1] );
177    outfilename.append( ".new" );
178    QFile outfile(outfilename);
179    if (!outfile.open(QIODevice::WriteOnly))
180    {
181        qDebug() << "Could not open" << outfilename;
182        return 1;
183    }
184
185    outfile.write( doc.toString(4).toUtf8() );
186    outfile.close();
187
188    return 0;
189}
Note: See TracBrowser for help on using the repository browser.