14 #include <QDomDocument> 15 #include <QTextStream> 19 #define WXL_NAMESPACE "http://schemas.microsoft.com/wix/2006/localization" 20 #define WXL_ELEMENT_ROOT "WixLocalization" 21 #define WXL_ELEMENT_MESSAGE "String" 22 #define WXL_ATTR_MESSAGE_ID "Id" 23 #define WXL_ATTR_LANGUAGE "LCID" 24 #define WXL_ATTR_TRANSLATION_TYPE "Culture" 25 #define WXL_ATTR_OVERRIDABLE "Overridable" 34 if(!culture.compare(
"en", Qt::CaseInsensitive))
36 else if(!culture.compare(
"cs", Qt::CaseInsensitive))
38 else if(!culture.compare(
"de", Qt::CaseInsensitive))
40 else if(!culture.compare(
"es", Qt::CaseInsensitive))
42 else if(!culture.compare(
"fa", Qt::CaseInsensitive))
44 else if(!culture.compare(
"fi", Qt::CaseInsensitive))
46 else if(!culture.compare(
"fr", Qt::CaseInsensitive))
48 else if(!culture.compare(
"he", Qt::CaseInsensitive))
50 else if(!culture.compare(
"it", Qt::CaseInsensitive))
52 else if(!culture.compare(
"nl", Qt::CaseInsensitive))
54 else if(!culture.compare(
"pl", Qt::CaseInsensitive))
56 else if(!culture.compare(
"pt", Qt::CaseInsensitive))
58 else if(!culture.compare(
"ro", Qt::CaseInsensitive))
60 else if(!culture.compare(
"ru", Qt::CaseInsensitive))
62 else if(!culture.compare(
"sv", Qt::CaseInsensitive))
71 const QString &msgid,
const QString &msgstr)
82 if (!msgstr.isEmpty())
83 message.appendChild(wxl->createTextNode(msgstr));
85 message.appendChild(wxl->createTextNode(msgid));
99 wxl.appendChild(root);
109 QString out = str.trimmed();
110 out = out.replace(
"\"",
"");
119 if (str.contains(
"#"))
120 return str.section(
"#", 0, 0);
130 QString out = msg.trimmed();
132 out.replace(
"\"\n\"",
"\n");
133 if (out.startsWith(
"\""))
134 out = out.remove(0, 1);
135 if (out.endsWith(
"\""))
137 out.replace(
"\\\"",
"\"");
141 while ( ((lind = out.indexOf(
"${")) >= 0) &&
142 ((rind = out.indexOf(
"}", lind)) > lind) ) {
143 out.replace(lind, 2,
"[");
144 out.replace(--rind, 1,
"]");
153 stream->skipWhiteSpace();
154 return stream->readLine().append(
"\n");
165 po->skipWhiteSpace();
167 line = po->readLine();
168 while (!po->atEnd() && !line.isEmpty())
169 line = po->readLine();
177 po2wxl(
const QString& culture, QTextStream *po, QDomDocument *wxl,
178 QString *errorMessage)
181 QString msgctxt, msgid, msgstr;
182 QDomElement msgElement;
187 Q_ASSERT(errorMessage);
193 wxl->documentElement().appendChild(
198 while (!po->atEnd()) {
200 while (line.startsWith(
"#")) {
201 if (line.startsWith(
"#:")) {
203 msgctxt = line.section(
" ", 1);
211 if (line.startsWith(
"msgctxt ")) {
212 msgctxt = line.section(
" ", 1);
218 if (!line.startsWith(
"msgid ")) {
219 *errorMessage =
"expected 'msgid' line";
222 msgid = line.section(
" ", 1);
225 while (line.startsWith(
"\"")) {
232 if (!line.startsWith(
"msgstr ")) {
233 *errorMessage =
"expected 'msgstr' line";
236 msgstr = line.section(
" ", 1);
239 while (line.startsWith(
"\"")) {
246 wxl->documentElement().appendChild(
258 QTextStream
error(stderr);
259 error <<
"usage: po2wxl [-q] -n <culture name> -i <infile.po> -o <outfile.wxl> " 261 error <<
" -q (optional) Quiet mode (errors are still displayed)\n";
262 error <<
" -n <culture> Culture name for translation\n";
263 error <<
" -i <infile.po> Input .po file\n";
264 error <<
" -o <outfile.wxl> Output .wxl file\n";
265 error <<
" -c <encoding> Text encoding (default: utf-8)\n";
273 QTextStream
error(stderr);
274 QString culture, errorMessage;
275 char *infile, *outfile;
276 QTextCodec *codec = QTextCodec::codecForName(
"utf-8");
280 if (argc < 5 || argc > 9)
282 for (
int i = 1;
i < argc;
i++) {
283 QString arg(argv[
i]);
284 if (!arg.compare(
"-q", Qt::CaseInsensitive))
286 else if (!arg.compare(
"-n", Qt::CaseInsensitive) && ++i < argc)
288 else if (!arg.compare(
"-i", Qt::CaseInsensitive) && ++i < argc)
290 else if (!arg.compare(
"-o", Qt::CaseInsensitive) && ++i < argc)
292 else if (!arg.compare(
"-c", Qt::CaseInsensitive) && ++i < argc) {
293 codec = QTextCodec::codecForName(argv[i]);
295 error <<
"Invalid text encoding specified\n";
303 QFile poFile(infile);
304 if (!poFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
305 error << QString(
"Unable to open '%1' for reading: %2\n").arg(infile)
306 .arg(poFile.errorString());
311 QTextStream po(&poFile);
313 int n_strings =
po2wxl(culture, &po, &wxl, &errorMessage);
315 error << QString(
"Unable to convert '%1': %2\n").arg(infile)
321 QFile wxlFile(outfile);
322 if (!wxlFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
323 error << QString(
"Unable to open '%1' for writing: %2\n").arg(outfile)
324 .arg(wxlFile.errorString());
329 QTextStream out(&wxlFile);
331 out << QString(
"<?xml version=\"1.0\" encoding=\"%1\"?>\n")
332 .arg(QString(codec->name()));
333 out << wxl.toString(4);
336 QTextStream results(stdout);
337 results << QString(
"Converted %1 strings from %2 to %3.\n").arg(n_strings)
DebugMessage error(const QString &fmt)
QDomDocument new_wxl_document(const QString &culture)
QString parse_message_context(const QString &str)
int po2wxl(const QString &culture, QTextStream *po, QDomDocument *wxl, QString *errorMessage)
#define WXL_ATTR_TRANSLATION_TYPE
#define WXL_ELEMENT_MESSAGE
#define WXL_ATTR_LANGUAGE
void skip_po_header(QTextStream *po)
#define WXL_ATTR_OVERRIDABLE
QString read_next_line(QTextStream *stream)
#define WXL_ATTR_MESSAGE_ID
void print_usage_and_exit()
QString culture_lcid(const QString &culture)
QString parse_message_context_lame(const QString &str)
int main(int argc, char *argv[])
QString parse_message_string(const QString &msg)
QDomElement new_message_element(QDomDocument *wxl, const QString &strid, const QString &msgid, const QString &msgstr)