Files
renpy-translator/mainwindow.h

111 lines
4.3 KiB
C++
Executable File

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QJsonObject>
#include <memory>
#include <QNetworkReply>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class QTreeWidgetItem;
class QFile;
class QNetworkReply;
class QAuthenticator;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_selectProjectDirButton_clicked();
// void on_reloadButton_clicked();
void on_languageCombo_currentTextChanged(const QString &selectedLanguage);
void on_reloadTranslationsButton_clicked();
void on_reloadFilesButton_clicked();
void on_nextUntranslatedButton_clicked();
void on_treeWidget_itemSelectionChanged();
void on_setTranslationButton_clicked();
void on_setTranslationAndJumpNextButton_clicked();
void on_setAndNextAndAutoTranslate_clicked();
void on_translationEdit_returnPressed();
void on_saveButton_clicked();
void on_cleanupButton_clicked();
void on_cleanupAndSaveButton_clicked();
void onDeeplTranslationPossibilitiesLoaded(QNetworkReply *reply);
void on_deeplTranslateFrom_currentTextChanged(const QString &sourceLanguage);
void on_autoTranslateButton_clicked();
void on_retryTranslationButton_clicked();
void on_bulkAutoTranslateButton_clicked();
void on_checkDeeplUsageButton_clicked();
void on_translationProviderCombo_currentIndexChanged(int index);
void on_libreTranslateUrl_editingFinished();
void on_searchButton_clicked();
void on_searchNextButton_clicked();
void on_deeplApiKey_editingFinished();
void on_copyButton_clicked();
private:
struct TranslationItem {
TranslationItem(int line_, QString character_, QString oldText_, QString newText_):
line(line_),
character(character_),
oldText(oldText_),
newText(newText_) {};
int line;
QString character;
QString oldText;
QString newText;
};
struct BulkTranslationItem {
QTreeWidgetItem *item;
QString originalText;
QString translatedText;
QVector<QString> placeholders;
};
std::unique_ptr<QNetworkAccessManager> networkManager;
Ui::MainWindow *ui;
QJsonObject configuration;
bool noConfigChange{false};
std::map<QString, QString> fileContentsMap;
std::map<QString, std::vector<QString> > translationsMap;
QString searchQuery;
void crawlProject();
void populateTreeWidgetFromMap();
void saveFiles(QStringList &failedFiles);
bool saveFile(QTreeWidgetItem *fileItem, QString &errorMessage);
bool createBackup(const QString &filePath, const QString &backupFileName);
bool editAndSaveFile(QTreeWidgetItem *fileItem, const QString &backupFileName, const QString &fileName);
bool saveToFile(const QString &backupFileName, const QStringList &lines);
bool parseAndEditFile(QFile &backupFile, QTreeWidgetItem *fileItem, QStringList &lines, bool &changed);
QString findNewText(QTreeWidgetItem *fileItem, const QString &lineNumber, const QString &originalText, const QString &speaker);
void loadDeeplTranslationPossibilities();
void renderDeeplSources();
void translationRequestFinished(QNetworkReply *reply, bool isLibreTranslate = false);
void loadLibreTranslateLanguages();
bool isLibreTranslateProvider() const;
QString libreTranslateUrl(const QString &path) const;
void requestNextBulkTranslationBatch();
void handleBulkTranslationReply(QNetworkReply *reply, int firstItem, int itemCount);
void showBulkTranslationDialog();
void onDeeplTranslationAuthenticationError(QNetworkReply *reply, QAuthenticator *authenticator);
void countAndShowUntranslated();
void searchNext();
QVector<TranslationItem> parseTextBlock(const QString &block);
void setConfigValue(const QString &key, const QString &value);
// DeepL placeholder protection: maps tag id -> original placeholder text
QVector<QString> deeplPlaceholderMap;
QString protectPlaceholdersForDeepl(const QString &input);
QString restorePlaceholdersFromDeepl(const QString &input);
QVector<BulkTranslationItem> bulkTranslations;
int nextBulkTranslationIndex{0};
bool bulkUsesLibreTranslate{false};
};
#endif // MAINWINDOW_H