You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.9 KiB
120 lines
3.9 KiB
#include "settingstranslator.h"
|
|
#include <QFileInfo>
|
|
|
|
SettingsTranslator::SettingsTranslator(const QString &srcPath) :
|
|
_srcFile{srcPath},
|
|
_src{&_srcFile}
|
|
{}
|
|
|
|
void SettingsTranslator::process(const QString &inPath)
|
|
{
|
|
auto settings = readDocument(inPath);
|
|
if(!nonstd::holds_alternative<SettingsConfigType>(settings))
|
|
throw XmlException{inPath, 0, 0, QStringLiteral("Expected the root element to be a SettingsConfig element")};
|
|
writeTranslations(nonstd::get<SettingsConfigType>(settings), inPath);
|
|
}
|
|
|
|
void SettingsTranslator::writeTranslations(const SettingsConfigType &settings, const QString &inPath)
|
|
{
|
|
QStringList strings;
|
|
for(auto &element : settings.content) {
|
|
if(nonstd::holds_alternative<CategoryType>(element))
|
|
readCategoryStrings(nonstd::get<CategoryType>(element), strings);
|
|
else if(nonstd::holds_alternative<SectionType>(element))
|
|
readSectionStrings(nonstd::get<SectionType>(element), strings);
|
|
else if(nonstd::holds_alternative<GroupType>(element))
|
|
readGroupStrings(nonstd::get<GroupType>(element), strings);
|
|
else if(nonstd::holds_alternative<EntryType>(element))
|
|
readEntryStrings(nonstd::get<EntryType>(element), strings);
|
|
else
|
|
Q_UNREACHABLE();
|
|
}
|
|
|
|
strings.removeDuplicates();
|
|
|
|
if(!_srcFile.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
throw FileException{_srcFile};
|
|
auto context = QFileInfo{inPath}.fileName();
|
|
|
|
_src << "#include <QtCore/QCoreApplication>\n\n"
|
|
<< "namespace {\n\n"
|
|
<< "void Q_DECL_UNUSED dummyfn()\n"
|
|
<< "{\n";
|
|
for(auto &string : strings) {
|
|
_src << "\tQCoreApplication::translate(\"" << context << "\", \""
|
|
<< string.replace(QLatin1Char('\\'), QStringLiteral("\\\\"))
|
|
.replace(QLatin1Char('\"'), QStringLiteral("\\\""))
|
|
<< "\");\n";
|
|
}
|
|
_src << "}\n\n"
|
|
<< "}\n";
|
|
|
|
_srcFile.close();
|
|
}
|
|
|
|
void SettingsTranslator::readCategoryStrings(const CategoryType &category, QStringList &strings)
|
|
{
|
|
readInfoStrings(category, strings);
|
|
for(auto &element : category.content) {
|
|
if(nonstd::holds_alternative<SectionType>(element))
|
|
readSectionStrings(nonstd::get<SectionType>(element), strings);
|
|
else if(nonstd::holds_alternative<GroupType>(element))
|
|
readGroupStrings(nonstd::get<GroupType>(element), strings);
|
|
else if(nonstd::holds_alternative<EntryType>(element))
|
|
readEntryStrings(nonstd::get<EntryType>(element), strings);
|
|
else
|
|
Q_UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
void SettingsTranslator::readSectionStrings(const SectionType §ion, QStringList &strings)
|
|
{
|
|
readInfoStrings(section, strings);
|
|
for(auto &element : section.content) {
|
|
if(nonstd::holds_alternative<GroupType>(element))
|
|
readGroupStrings(nonstd::get<GroupType>(element), strings);
|
|
else if(nonstd::holds_alternative<EntryType>(element))
|
|
readEntryStrings(nonstd::get<EntryType>(element), strings);
|
|
else
|
|
Q_UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
void SettingsTranslator::readGroupStrings(const GroupType &group, QStringList &strings)
|
|
{
|
|
readInfoStrings(group, strings);
|
|
for(auto &element : group.content) {
|
|
if(nonstd::holds_alternative<EntryType>(element))
|
|
readEntryStrings(nonstd::get<EntryType>(element), strings);
|
|
else
|
|
Q_UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
void SettingsTranslator::readEntryStrings(const EntryType &entry, QStringList &strings)
|
|
{
|
|
readInfoStrings(entry, strings);
|
|
if(entry.trdefault && entry.defaultValue)
|
|
strings.append(entry.defaultValue.value());
|
|
strings.append(entry.searchKeys);
|
|
for(const auto &prop : entry.properties)
|
|
readElementStrings(prop, strings);
|
|
}
|
|
|
|
void SettingsTranslator::readInfoStrings(const BasicContainerInfo &info, QStringList &strings)
|
|
{
|
|
if(info.title)
|
|
strings.append(info.title.value());
|
|
if(info.tooltip)
|
|
strings.append(info.tooltip.value());
|
|
}
|
|
|
|
void SettingsTranslator::readElementStrings(const ElementType &element, QStringList &strings)
|
|
{
|
|
if(element.content && (element.tr || element.ztr))
|
|
strings.append(element.content.value());
|
|
for(const auto &prop : element.elements)
|
|
readElementStrings(prop, strings);
|
|
for(const auto &prop : element.properties)
|
|
readElementStrings(prop, strings);
|
|
}
|
|
|