diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..01e00f3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+CMakeLists.txt.user
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 54c5f2f..82ba282 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,47 +12,50 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)
-set(TS_FILES translations/lubuntu-update_en_US.ts)
+set(TS_FILES
+ src/translations/lubuntu-update_en_US.ts
+ src/translations/lubuntu-update_es_ES.ts
+ src/translations/lubuntu-update_zh_CN.ts
+)
set(PROJECT_SOURCES
- main.cpp
- mainwindow.cpp
- mainwindow.h
- mainwindow.ui
- orchestrator.h
- orchestrator.cpp
- aptmanager.h
- aptmanager.cpp
- conffilewidget.h
- conffilewidget.cpp
- conffilewidget.ui
- diffdisplaydialog.h
- diffdisplaydialog.cpp
- diffdisplaydialog.ui
- conffilehandlerdialog.h
- conffilehandlerdialog.cpp
- conffilehandlerdialog.ui
- ipcfilewatcher.h
- ipcfilewatcher.cpp
+ src/main.cpp
+ src/mainwindow.cpp
+ src/mainwindow.h
+ src/mainwindow.ui
+ src/orchestrator.h
+ src/orchestrator.cpp
+ src/aptmanager.h
+ src/aptmanager.cpp
+ src/conffilewidget.h
+ src/conffilewidget.cpp
+ src/conffilewidget.ui
+ src/diffdisplaydialog.h
+ src/diffdisplaydialog.cpp
+ src/diffdisplaydialog.ui
+ src/conffilehandlerdialog.h
+ src/conffilehandlerdialog.cpp
+ src/conffilehandlerdialog.ui
+ src/ipcfilewatcher.h
+ src/ipcfilewatcher.cpp
${TS_FILES}
)
-if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
- qt_add_executable(lubuntu-update
- MANUAL_FINALIZATION
- ${PROJECT_SOURCES}
- resources.qrc
- )
+set(TRANSLATION_RESOURCES "src/translations.qrc")
+
+configure_file(${TRANSLATION_RESOURCES} translations.qrc COPYONLY)
+qt5_add_translation(QM_FILES ${TS_FILES})
+qt5_add_resources(QM_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
- qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
-else()
- add_executable(lubuntu-update
- ${PROJECT_SOURCES}
- resources.qrc
- )
+add_custom_target(translations ALL DEPENDS ${QM_FILES})
+
+add_executable(lubuntu-update
+ ${PROJECT_SOURCES}
+ ${QM_RESOURCES}
+ src/resources.qrc
+)
- qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
-endif()
+add_dependencies(lubuntu-update translations)
target_link_libraries(lubuntu-update PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
@@ -70,8 +73,6 @@ install(TARGETS lubuntu-update
# has gotten into /usr/libexec you're compromised anyway, so not much to worry
# about. Therefore we always, *always* install this script into /usr/libexec/,
# no matter where the rest of the program goes.
-install(FILES lubuntu-update-backend DESTINATION /usr/libexec/)
+install(FILES src/lubuntu-update-backend DESTINATION /usr/libexec/)
-if(QT_VERSION_MAJOR EQUAL 6)
- qt_finalize_executable(lubuntu-update)
-endif()
+install(FILES lubuntu-update.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/)
diff --git a/README.md b/README.md
index f3b8ead..9585b01 100644
--- a/README.md
+++ b/README.md
@@ -22,8 +22,32 @@ Qt Creator is recommended for editing the code. It is present in Ubuntu's offici
## Missing features
-* The Details button is hidden and does nothing. Eventually it should display a list of packages, the old version of them, the new version of them, and a link to their Launchpad page.
+* Double-clicking on a package doesn't show detailed information for it yet.
* There's no support for release upgrading. This is currently unnecessary as this updater is only going to be shipped in Noble and later, but it will become a big deal in the (potentially near) future.
-* There's no support for doing an `apt update` for checking for recent updates. This seems rather important *now*.
-* Most of the internal strings aren't translatable...
-* ...and the bit of translation support there is, is totally untested and quite possibly not functioning properly. Borrow from what we did with lubuntu-installer-prompt to fix this.
+* The translation support is mostly untested, though it should work.
+
+## Translations
+
+Run the `gen_ts.sh` script after making any code modifications to ensure that the translations files are up-to-date for translators to work on.
+
+To add a new language to be translated:
+
+* Open the `gen_ts.sh` script and add the locale code for the new language to the `langList` array.
+* Run the script after doing this - a new template .ts file will be generated under `src/translations/`.
+* Next, add the new template file to the `TS_FILES` list in `CMakeLists.txt` - it will be named `src/translations/lubuntu-update_locale_CODE.ts`, where `locale_CODE` is the locale code of the added language.
+* Finally, add a line in the src/translations.qrc resource file to include the new translation file. The line should look like `lubuntu-update_locale_CODE.qm`, where `locale_CODE` is the locale code of the added language. This line should go inside the `` tag.
+
+For instance, if I were to add Chinese to the list of languages that could be translated into, I would do this:
+
+ vim gen_ts.sh
+ # add this code to the langList array:
+ # 'zh_CN'
+ ./gen_ts.sh
+ vim CMakeLists.txt
+ # add this line to the TS_FILES list:
+ # src/translations/lubuntu-update_zh_CN.ts
+ vim src/translations.qrc
+ # add this line to the list of file resources:
+ # lubuntu-update_zh_CN.qm
+
+The program will now pick up the added language at build time. Any translations added to the newly created .ts file will be shown to program users who select the new language.
diff --git a/gen_ts.sh b/gen_ts.sh
new file mode 100755
index 0000000..f6d8d36
--- /dev/null
+++ b/gen_ts.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+langList=('en_US' 'es_ES' 'zh_CN')
+for i in ${langList[@]}; do
+ targetFile="translations/lubuntu-update_$i.ts"
+ if [ ! -e $targetFile ]; then
+ echo "" > $targetFile
+ echo "" >> $targetFile
+ echo "" >> $targetFile
+ fi
+done
+lupdate *.cpp *.h *.ui -ts translations/*
diff --git a/aptmanager.cpp b/src/aptmanager.cpp
similarity index 90%
rename from aptmanager.cpp
rename to src/aptmanager.cpp
index 505dd98..5c2d9de 100644
--- a/aptmanager.cpp
+++ b/src/aptmanager.cpp
@@ -30,8 +30,19 @@ void AptManager::applyFullUpgrade()
// Note that the lubuntu-update-backend script sets LC_ALL=C in it already, so we don't need to add that here.
aptProcess->setArguments(QStringList() << "/usr/libexec/lubuntu-update-backend" << "doupdate");
aptProcess->setProcessChannelMode(QProcess::MergedChannels);
- QObject::connect(aptProcess, &QProcess::readyRead, this, &AptManager::handleProcessBuffer);
- QObject::connect(aptProcess, QOverload::of(&QProcess::finished), this, &AptManager::handleProcessBuffer);
+ QObject::connect(aptProcess, &QProcess::readyRead, this, &AptManager::handleUpdateProcessBuffer);
+ QObject::connect(aptProcess, QOverload::of(&QProcess::finished), this, &AptManager::handleUpdateProcessBuffer);
+ aptProcess->start();
+}
+
+void AptManager::checkForUpdates()
+{
+ aptProcess = new QProcess();
+ aptProcess->setProgram("/usr/bin/lxqt-sudo");
+ aptProcess->setArguments(QStringList() << "/usr/libexec/lubuntu-update-backend" << "checkupdate");
+ aptProcess->setProcessChannelMode(QProcess::MergedChannels);
+ QObject::connect(aptProcess, &QProcess::readyRead, this, &AptManager::handleCheckUpdateProcessBuffer);
+ QObject::connect(aptProcess, QOverload::of(&QProcess::finished), this, &AptManager::handleCheckUpdateProcessBuffer);
aptProcess->start();
}
@@ -56,7 +67,7 @@ void AptManager::doneWithConffiles()
aptProcess->closeWriteChannel();
}
-void AptManager::handleProcessBuffer()
+void AptManager::handleUpdateProcessBuffer()
{
int maxWaitTime = 20;
while (!aptProcess->canReadLine() && maxWaitTime > 0) {
@@ -149,6 +160,27 @@ void AptManager::handleProcessBuffer()
}
}
+void AptManager::handleCheckUpdateProcessBuffer()
+{
+ /*
+ * We don't have the busy wait here because the apt output when doing
+ * `apt-get update` is somewhat ill-formed and difficult to fix, and
+ * busy-waiting was resulting in *awful* progress bar choppiness.
+ */
+
+ char lineBuf[2048];
+ while(aptProcess->canReadLine()) {
+ aptProcess->readLine(lineBuf, 2048);
+ QString line = QString(lineBuf);
+ emit logLineReady(line);
+ }
+
+ if (aptProcess->state() == QProcess::NotRunning) {
+ emit checkUpdatesComplete();
+ aptProcess->deleteLater();
+ }
+}
+
QList AptManager::getUpdateInfo()
{
/*
diff --git a/aptmanager.h b/src/aptmanager.h
similarity index 89%
rename from aptmanager.h
rename to src/aptmanager.h
index 19d16cb..49e0062 100644
--- a/aptmanager.h
+++ b/src/aptmanager.h
@@ -17,18 +17,21 @@ public:
AptManager(QObject *parent = nullptr);
static QList getUpdateInfo();
void applyFullUpgrade();
+ void checkForUpdates();
void keepConffile(QString conffile);
void replaceConffile(QString conffile);
void doneWithConffiles();
signals:
void updateComplete();
+ void checkUpdatesComplete();
void progressUpdated(int progress);
void logLineReady(QString logLine);
void conffileListReady(QStringList conffileList);
private slots:
- void handleProcessBuffer();
+ void handleUpdateProcessBuffer();
+ void handleCheckUpdateProcessBuffer();
private:
static void parseAptLine(QString line, bool *gettingInstallPackages, bool *gettingUpgradePackages, bool *gettingUninstallPackages, bool *gettingHeldPackages, bool *gettingPackageList);
diff --git a/conffilehandlerdialog.cpp b/src/conffilehandlerdialog.cpp
similarity index 100%
rename from conffilehandlerdialog.cpp
rename to src/conffilehandlerdialog.cpp
diff --git a/conffilehandlerdialog.h b/src/conffilehandlerdialog.h
similarity index 100%
rename from conffilehandlerdialog.h
rename to src/conffilehandlerdialog.h
diff --git a/conffilehandlerdialog.ui b/src/conffilehandlerdialog.ui
similarity index 100%
rename from conffilehandlerdialog.ui
rename to src/conffilehandlerdialog.ui
diff --git a/conffilewidget.cpp b/src/conffilewidget.cpp
similarity index 98%
rename from conffilewidget.cpp
rename to src/conffilewidget.cpp
index c716a07..d0ed56a 100644
--- a/conffilewidget.cpp
+++ b/src/conffilewidget.cpp
@@ -4,8 +4,6 @@
#include
-#include
-
ConffileWidget::ConffileWidget(QString filename, QWidget *parent) :
QWidget(parent),
ui(new Ui::ConffileWidget)
diff --git a/conffilewidget.h b/src/conffilewidget.h
similarity index 100%
rename from conffilewidget.h
rename to src/conffilewidget.h
diff --git a/conffilewidget.ui b/src/conffilewidget.ui
similarity index 100%
rename from conffilewidget.ui
rename to src/conffilewidget.ui
diff --git a/diffdisplaydialog.cpp b/src/diffdisplaydialog.cpp
similarity index 100%
rename from diffdisplaydialog.cpp
rename to src/diffdisplaydialog.cpp
diff --git a/diffdisplaydialog.h b/src/diffdisplaydialog.h
similarity index 100%
rename from diffdisplaydialog.h
rename to src/diffdisplaydialog.h
diff --git a/diffdisplaydialog.ui b/src/diffdisplaydialog.ui
similarity index 100%
rename from diffdisplaydialog.ui
rename to src/diffdisplaydialog.ui
diff --git a/ipcfilewatcher.cpp b/src/ipcfilewatcher.cpp
similarity index 100%
rename from ipcfilewatcher.cpp
rename to src/ipcfilewatcher.cpp
diff --git a/ipcfilewatcher.h b/src/ipcfilewatcher.h
similarity index 100%
rename from ipcfilewatcher.h
rename to src/ipcfilewatcher.h
diff --git a/lubuntu-update-backend b/src/lubuntu-update-backend
similarity index 94%
rename from lubuntu-update-backend
rename to src/lubuntu-update-backend
index 1768a30..da4af65 100755
--- a/lubuntu-update-backend
+++ b/src/lubuntu-update-backend
@@ -8,7 +8,7 @@ if [ "$1" = 'pkgver' ]; then
shift
while [ "$1" != '' ]; do
source="$(apt-cache show "$1" | grep 'Source:' | cut -d' ' -f2)"
- version="$(apt-cache show lubuntu-default-settings | grep Version: | head -n1 | cut -d' ' -f2)"
+ version="$(apt-cache show "$1" | grep Version: | head -n1 | cut -d' ' -f2)"
if [ "$source" = '' ]; then
echo "$1"
else
@@ -17,6 +17,8 @@ if [ "$1" = 'pkgver' ]; then
echo "$version"
shift
done
+elif [ "$1" = 'checkupdate' ]; then
+ apt-get -o Apt::Color='0' -o Dpkg::Use-Pty='0' update
elif [ "$1" = 'doupdate' ]; then
# Prepare to be able to grep through the logs
rm /run/lubuntu-update-apt-log || true
diff --git a/main.cpp b/src/main.cpp
similarity index 97%
rename from main.cpp
rename to src/main.cpp
index 0d7ab0e..0eb42e1 100644
--- a/main.cpp
+++ b/src/main.cpp
@@ -16,7 +16,7 @@ int main(int argc, char *argv[])
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
- const QString baseName = "lubuntu-update_" + QLocale(locale).name();
+ const QString baseName = QLocale(locale).name();
if (translator.load(":/i18n/" + baseName)) {
a.installTranslator(&translator);
break;
diff --git a/mainwindow.cpp b/src/mainwindow.cpp
similarity index 71%
rename from mainwindow.cpp
rename to src/mainwindow.cpp
index b4a27b0..99168eb 100644
--- a/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -17,12 +17,11 @@ MainWindow::MainWindow(QWidget *parent)
ui->progressBar->setVisible(false);
ui->logView->setVisible(false);
- // FIXME: Implement the Details screen and attach this button to it rather than disabling it.
- ui->detailsButton->setVisible(false);
-
connect(ui->installButton, &QPushButton::clicked, this, &MainWindow::onInstallButtonClicked);
+ connect(ui->checkUpdatesButton, &QPushButton::clicked, this, &MainWindow::onCheckUpdatesButtonClicked);
connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::onCloseButtonClicked);
connect(aptManager, &AptManager::updateComplete, this, &MainWindow::onUpdateCompleted);
+ connect(aptManager, &AptManager::checkUpdatesComplete, this, &MainWindow::onCheckUpdatesCompleted);
connect(aptManager, &AptManager::progressUpdated, this, &MainWindow::onProgressUpdate);
connect(aptManager, &AptManager::logLineReady, this, &MainWindow::onLogLineReady);
connect(aptManager, &AptManager::conffileListReady, this, &MainWindow::onConffileListReady);
@@ -39,9 +38,9 @@ void MainWindow::setUpdateInfo(QList updateInfo)
// The progress bar and log view are shown after the user chooses to begin installing updates
ui->progressBar->setVisible(false);
ui->logView->setVisible(false);
- ui->detailsButton->setEnabled(true);
ui->closeButton->setEnabled(true);
ui->installButton->setEnabled(false); // Correct, it starts out false, we turn it to true if there are any updates.
+ ui->checkUpdatesButton->setEnabled(true);
for (int i = 0;i < 4;i++) {
if (updateInfo[i].count() > 0) {
@@ -51,16 +50,16 @@ void MainWindow::setUpdateInfo(QList updateInfo)
QTreeWidgetItem *installItem;
switch (i) {
case 0:
- installItem = new QTreeWidgetItem(QStringList() << "To be installed");
+ installItem = new QTreeWidgetItem(QStringList() << tr("To be installed"));
break;
case 1:
- installItem = new QTreeWidgetItem(QStringList() << "To be upgraded");
+ installItem = new QTreeWidgetItem(QStringList() << tr("To be upgraded"));
break;
case 2:
- installItem = new QTreeWidgetItem(QStringList() << "To be removed");
+ installItem = new QTreeWidgetItem(QStringList() << tr("To be removed"));
break;
case 3:
- installItem = new QTreeWidgetItem(QStringList() << "Held back (usually temporarily)");
+ installItem = new QTreeWidgetItem(QStringList() << tr("Held back (usually temporarily)"));
break;
}
@@ -71,7 +70,7 @@ void MainWindow::setUpdateInfo(QList updateInfo)
ui->packageView->addTopLevelItem(installItem);
}
- ui->statLabel->setText(QString("%1 package(s) will be updated. %2 of these updates are security-related.")
+ ui->statLabel->setText(tr("%1 package(s) will be updated. %2 of these updates are security-related.")
.arg(QString::number(updateInfo[0].count() + updateInfo[1].count() + updateInfo[2].count()),
QString::number(updateInfo[4].count())));
}
@@ -102,14 +101,30 @@ void MainWindow::closeEvent(QCloseEvent *event)
void MainWindow::onInstallButtonClicked()
{
+ ui->logView->clear();
ui->progressBar->setVisible(true);
ui->logView->setVisible(true);
ui->installButton->setEnabled(false);
- ui->detailsButton->setEnabled(false);
+ ui->checkUpdatesButton->setEnabled(false);
ui->closeButton->setEnabled(false);
+ ui->progressBar->setMinimum(0);
+ ui->progressBar->setMaximum(100);
aptManager->applyFullUpgrade();
}
+void MainWindow::onCheckUpdatesButtonClicked()
+{
+ ui->logView->clear();
+ ui->progressBar->setVisible(true);
+ ui->logView->setVisible(true);
+ ui->installButton->setEnabled(false);
+ ui->checkUpdatesButton->setEnabled(false);
+ ui->closeButton->setEnabled(false);
+ ui->progressBar->setMinimum(0);
+ ui->progressBar->setMaximum(0);
+ aptManager->checkForUpdates();
+}
+
void MainWindow::onCloseButtonClicked()
{
hide();
@@ -118,12 +133,19 @@ void MainWindow::onCloseButtonClicked()
void MainWindow::onUpdateCompleted()
{
ui->closeButton->setEnabled(true);
+ ui->checkUpdatesButton->setEnabled(true);
ui->installButton->setEnabled(false);
ui->progressBar->setVisible(false);
- ui->statLabel->setText("Update installation complete.");
+ ui->statLabel->setText(tr("Update installation complete."));
emit updatesInstalled(); // this tells the orchestrator to hide the tray icon
}
+void MainWindow::onCheckUpdatesCompleted()
+{
+ ui->closeButton->setEnabled(true); // unlocks the updater so that the orchestrator actually can update things
+ emit updatesRefreshed(); // this tells the orchestrator to re-scan for updates
+}
+
void MainWindow::onProgressUpdate(int progress)
{
ui->progressBar->setValue(progress);
diff --git a/mainwindow.h b/src/mainwindow.h
similarity index 89%
rename from mainwindow.h
rename to src/mainwindow.h
index dc16cab..c5415e5 100644
--- a/mainwindow.h
+++ b/src/mainwindow.h
@@ -25,14 +25,17 @@ public:
signals:
void updatesInstalled();
+ void updatesRefreshed();
protected slots:
void closeEvent(QCloseEvent *event) override;
private slots:
void onInstallButtonClicked();
+ void onCheckUpdatesButtonClicked();
void onCloseButtonClicked();
void onUpdateCompleted();
+ void onCheckUpdatesCompleted();
void onProgressUpdate(int progress);
void onLogLineReady(QString logLine);
void onConffileListReady(QStringList conffileList);
diff --git a/mainwindow.ui b/src/mainwindow.ui
similarity index 96%
rename from mainwindow.ui
rename to src/mainwindow.ui
index cb0935b..c80921f 100644
--- a/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -86,9 +86,9 @@ font: 9pt "Monospace";
-
-
+
- Details
+ Check for Updates
diff --git a/orchestrator.cpp b/src/orchestrator.cpp
similarity index 88%
rename from orchestrator.cpp
rename to src/orchestrator.cpp
index 36e4085..21e359f 100644
--- a/orchestrator.cpp
+++ b/src/orchestrator.cpp
@@ -15,6 +15,7 @@ Orchestrator::Orchestrator(QObject *parent)
connect(checkTimer, &QTimer::timeout, this, &Orchestrator::checkForUpdates);
connect(trayIcon, &QSystemTrayIcon::activated, this, &Orchestrator::displayUpdater);
connect(&updaterWindow, &MainWindow::updatesInstalled, this, &Orchestrator::handleUpdatesInstalled);
+ connect(&updaterWindow, &MainWindow::updatesRefreshed, this, &Orchestrator::handleUpdatesRefreshed);
checkTimer->start(21600000); // check four times a day, at least one of those times unattended-upgrades should have refreshed the apt database
@@ -34,7 +35,7 @@ void Orchestrator::checkForUpdates()
trayIcon->show();
// Yes, we do intentionally use updateInfo[1], then updateInfo[0], then updateInfo[2]. The updateInfo array is populated in a different order than the one we display in.
trayIcon->showMessage("",
- QString("Updates available!\n\n%1 to upgrade, %2 to install, and %3 to remove.\n\nClick the tray icon to install the updates.")
+ tr("Updates available!\n\n%1 to upgrade, %2 to install, and %3 to remove.\n\nClick the tray icon to install the updates.")
.arg(QString::number(updateInfo[1].count()), QString::number(updateInfo[0].count()), QString::number(updateInfo[2].count())));
}
}
@@ -58,3 +59,9 @@ void Orchestrator::handleUpdatesInstalled()
}
trayIcon->hide();
}
+
+void Orchestrator::handleUpdatesRefreshed()
+{
+ checkForUpdates();
+ displayUpdater();
+}
diff --git a/orchestrator.h b/src/orchestrator.h
similarity index 93%
rename from orchestrator.h
rename to src/orchestrator.h
index 0e5cd45..e9eb690 100644
--- a/orchestrator.h
+++ b/src/orchestrator.h
@@ -21,6 +21,7 @@ public slots:
private slots:
void checkForUpdates();
void handleUpdatesInstalled();
+ void handleUpdatesRefreshed();
private:
QTimer *checkTimer;
diff --git a/res/images/update.svg b/src/res/images/update.svg
similarity index 100%
rename from res/images/update.svg
rename to src/res/images/update.svg
diff --git a/resources.qrc b/src/resources.qrc
similarity index 100%
rename from resources.qrc
rename to src/resources.qrc
diff --git a/src/translations.qrc b/src/translations.qrc
new file mode 100644
index 0000000..feb5e13
--- /dev/null
+++ b/src/translations.qrc
@@ -0,0 +1,7 @@
+
+
+ lubuntu-update_en_US.qm
+ lubuntu-update_es_ES.qm
+ lubuntu-update_zh_CN.qm
+
+
diff --git a/src/translations/lubuntu-update_en_US.ts b/src/translations/lubuntu-update_en_US.ts
new file mode 100644
index 0000000..facb5e7
--- /dev/null
+++ b/src/translations/lubuntu-update_en_US.ts
@@ -0,0 +1,143 @@
+
+
+
+
+ ConffileHandlerDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ConffileWidget
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DiffDisplayDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Orchestrator
+
+
+
+
+
+
+
diff --git a/src/translations/lubuntu-update_es_ES.ts b/src/translations/lubuntu-update_es_ES.ts
new file mode 100644
index 0000000..84660c3
--- /dev/null
+++ b/src/translations/lubuntu-update_es_ES.ts
@@ -0,0 +1,143 @@
+
+
+
+
+ ConffileHandlerDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ConffileWidget
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DiffDisplayDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Orchestrator
+
+
+
+
+
+
+
diff --git a/src/translations/lubuntu-update_zh_CN.ts b/src/translations/lubuntu-update_zh_CN.ts
new file mode 100644
index 0000000..ccd2be6
--- /dev/null
+++ b/src/translations/lubuntu-update_zh_CN.ts
@@ -0,0 +1,143 @@
+
+
+
+
+ ConffileHandlerDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ConffileWidget
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DiffDisplayDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Orchestrator
+
+
+
+
+
+
+
diff --git a/translations/lubuntu-update_en_US.ts b/translations/lubuntu-update_en_US.ts
deleted file mode 100644
index edd0d34..0000000
--- a/translations/lubuntu-update_en_US.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-