Localize all UI strings

This commit is contained in:
Joshua Goins 2023-08-31 13:34:34 +02:00
parent 6920e0c123
commit 1a0b6b8dd0
6 changed files with 136 additions and 120 deletions

View file

@ -4,6 +4,7 @@
#include "ArtConfigWindow.h" #include "ArtConfigWindow.h"
#include <KLocalizedString>
#include <QFile> #include <QFile>
#include <QFormLayout> #include <QFormLayout>
#include <QGroupBox> #include <QGroupBox>
@ -31,26 +32,26 @@ ArtConfigWindow::ArtConfigWindow(const QString& filename, QWidget* parent) : QDi
formLayout->addWidget(galleryScrollArea); formLayout->addWidget(galleryScrollArea);
m_newBannerEdit = new QLineEdit(); m_newBannerEdit = new QLineEdit();
formLayout->addRow(QStringLiteral("New Banner"), m_newBannerEdit); formLayout->addRow(i18nc("@label:textbox", "New Banner"), m_newBannerEdit);
m_commissionsOpen = new QCheckBox(); m_commissionsOpen = new QCheckBox();
formLayout->addRow(QStringLiteral("Commissions Open"), m_commissionsOpen); formLayout->addRow(i18nc("@option:check", "Commissions Open"), m_commissionsOpen);
auto bottomButtonLayout = new QHBoxLayout(); auto bottomButtonLayout = new QHBoxLayout();
formLayout->addRow(bottomButtonLayout); formLayout->addRow(bottomButtonLayout);
auto cancelButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-close")), QStringLiteral("Cancel")); auto cancelButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-close")), i18nc("@action:button", "Cancel"));
connect(cancelButton, &QPushButton::clicked, this, &ArtConfigWindow::close); connect(cancelButton, &QPushButton::clicked, this, &ArtConfigWindow::close);
bottomButtonLayout->addWidget(cancelButton); bottomButtonLayout->addWidget(cancelButton);
bottomButtonLayout->addStretch(1); bottomButtonLayout->addStretch(1);
auto saveButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-ok")), QStringLiteral("Save")); auto saveButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-ok")), i18nc("@action:button", "Save"));
connect(saveButton, &QPushButton::clicked, this, [this, filename] { connect(saveButton, &QPushButton::clicked, this, [this, filename] {
saveData(filename); saveData(filename);
}); });
bottomButtonLayout->addWidget(saveButton); bottomButtonLayout->addWidget(saveButton);
if(QFile::exists(filename)) { if(QFile::exists(filename)) {
loadData(filename); loadData(filename);
} }
} }

View file

@ -5,17 +5,18 @@
#include "ArtDetailWindow.h" #include "ArtDetailWindow.h"
#include "imagelabel.h" #include "imagelabel.h"
#include <KLocalizedString>
#include <QDateEdit> #include <QDateEdit>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QFormLayout> #include <QFormLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QHBoxLayout>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
#include <QLineEdit> #include <QLineEdit>
#include <QPushButton> #include <QPushButton>
#include <QTextEdit> #include <QTextEdit>
#include <QHBoxLayout>
ArtDetailWindow::ArtDetailWindow(const QString& filename, const QString& assetDirectory, QWidget* parent) : QDialog(parent) { ArtDetailWindow::ArtDetailWindow(const QString& filename, const QString& assetDirectory, QWidget* parent) : QDialog(parent) {
setMinimumWidth(800); setMinimumWidth(800);
@ -38,32 +39,32 @@ ArtDetailWindow::ArtDetailWindow(const QString& filename, const QString& assetDi
QImage image; QImage image;
image.load(QStringLiteral("%1/%2.webp").arg(assetDirectory, withoutExtension)); image.load(QStringLiteral("%1/%2.webp").arg(assetDirectory, withoutExtension));
auto previewBox = new QGroupBox(QStringLiteral("Preview")); auto previewBox = new QGroupBox(i18nc("@title:group", "Preview"));
mainLayout->addWidget(previewBox); mainLayout->addWidget(previewBox);
auto previewLayout = new QVBoxLayout(); auto previewLayout = new QVBoxLayout();
previewBox->setLayout(previewLayout); previewBox->setLayout(previewLayout);
auto imageView = new ImageLabel(); auto imageView = new ImageLabel();
imageView->setPixmap(QPixmap::fromImage(image)); imageView->setPixmap(QPixmap::fromImage(image));
previewLayout->addWidget(imageView); previewLayout->addWidget(imageView);
m_titleEdit = new QLineEdit(); m_titleEdit = new QLineEdit();
formLayout->addRow(QStringLiteral("Title"), m_titleEdit); formLayout->addRow(i18nc("@label:textbox", "Title"), m_titleEdit);
m_knowExactDateBox = new QCheckBox(); m_knowExactDateBox = new QCheckBox();
connect(m_knowExactDateBox, &QCheckBox::toggled, this, [this](bool checked) { connect(m_knowExactDateBox, &QCheckBox::toggled, this, [this](bool checked) {
if (checked) { if (checked) {
m_dateEdit->setDisplayFormat(QStringLiteral("yyyy-MM-dd")); m_dateEdit->setDisplayFormat(QStringLiteral("yyyy-MM-dd"));
} else { } else {
m_dateEdit->setDisplayFormat(QStringLiteral("yyyy")); m_dateEdit->setDisplayFormat(QStringLiteral("yyyy"));
} }
}); });
formLayout->addRow(QStringLiteral("Know Exact Date?"), m_knowExactDateBox); formLayout->addRow(i18nc("@option:check", "Know Exact Date?"), m_knowExactDateBox);
m_dateEdit = new QDateEdit(); m_dateEdit = new QDateEdit();
m_dateEdit->setCalendarPopup(true); m_dateEdit->setCalendarPopup(true);
formLayout->addRow(QStringLiteral("Date"), m_dateEdit); formLayout->addRow(QStringLiteral("Date"), m_dateEdit);
m_altTextEdit = new QTextEdit(); m_altTextEdit = new QTextEdit();
m_altTextEdit->setAcceptRichText(false); m_altTextEdit->setAcceptRichText(false);
@ -74,99 +75,101 @@ ArtDetailWindow::ArtDetailWindow(const QString& filename, const QString& assetDi
formLayout->addRow(QStringLiteral("Description"), m_descriptionEdit); formLayout->addRow(QStringLiteral("Description"), m_descriptionEdit);
m_nsfwBox = new QCheckBox(); m_nsfwBox = new QCheckBox();
formLayout->addRow(QStringLiteral("Is NSFW?"), m_nsfwBox); formLayout->addRow(i18nc("@option:check", "Is NSFW?"), m_nsfwBox);
m_mastodonUrlEdit = new QLineEdit(); m_mastodonUrlEdit = new QLineEdit();
formLayout->addRow(QStringLiteral("Mastodon URL"), m_mastodonUrlEdit); formLayout->addRow(i18nc("@label:textbox", "Mastodon URL"), m_mastodonUrlEdit);
m_pixivUrlEdit = new QLineEdit(); m_pixivUrlEdit = new QLineEdit();
formLayout->addRow(QStringLiteral("Pixiv URL"), m_pixivUrlEdit); formLayout->addRow(i18nc("@label:textbox", "Pixiv URL"), m_pixivUrlEdit);
m_newgroundsUrlEdit = new QLineEdit(); m_newgroundsUrlEdit = new QLineEdit();
formLayout->addRow(QStringLiteral("Newgrounds URL"), m_newgroundsUrlEdit); formLayout->addRow(i18nc("@label:textbox", "Newgrounds URL"), m_newgroundsUrlEdit);
m_programEdit = new QLineEdit(); m_programEdit = new QLineEdit();
formLayout->addRow(QStringLiteral("Program"), m_programEdit); formLayout->addRow(i18nc("@label:textbox", "Program"), m_programEdit);
auto charactersLayout = new QVBoxLayout(); auto charactersLayout = new QVBoxLayout();
formLayout->addRow(QStringLiteral("Characters"), charactersLayout); formLayout->addRow(i18nc("@title:group", "Characters"), charactersLayout);
auto characterList = new QListView(); auto characterList = new QListView();
m_characterListModel = new QStringListModel(); m_characterListModel = new QStringListModel();
characterList->setModel(m_characterListModel); characterList->setModel(m_characterListModel);
charactersLayout->addWidget(characterList); charactersLayout->addWidget(characterList);
auto characterButtonLayout = new QHBoxLayout(); auto characterButtonLayout = new QHBoxLayout();
charactersLayout->addLayout(characterButtonLayout); charactersLayout->addLayout(characterButtonLayout);
auto addCharacterButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-add")), QStringLiteral("Add")); auto addCharacterButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-add")), i18nc("@action:button", "Add"));
connect(addCharacterButton, &QPushButton::clicked, this, [this] { connect(addCharacterButton, &QPushButton::clicked, this, [this] {
auto tmp = m_characterListModel->stringList();; auto tmp = m_characterListModel->stringList();
tmp.push_back(QStringLiteral("New Character")); ;
tmp.push_back(QStringLiteral("New Character"));
m_characterListModel->setStringList(tmp); m_characterListModel->setStringList(tmp);
}); });
characterButtonLayout->addWidget(addCharacterButton); characterButtonLayout->addWidget(addCharacterButton);
characterButtonLayout->addStretch(1); characterButtonLayout->addStretch(1);
auto removeCharacterButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-remove")), QStringLiteral("Remove")); auto removeCharacterButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-remove")), i18nc("@action:button", "Remove"));
connect(removeCharacterButton, &QPushButton::clicked, this, [this, characterList] { connect(removeCharacterButton, &QPushButton::clicked, this, [this, characterList] {
if(characterList->selectionModel()->hasSelection()) { if (characterList->selectionModel()->hasSelection()) {
const QString toRemove = characterList->selectionModel()->selectedRows()[0].data().toString(); const QString toRemove = characterList->selectionModel()->selectedRows()[0].data().toString();
auto tmp = m_characterListModel->stringList(); auto tmp = m_characterListModel->stringList();
tmp.removeOne(toRemove); tmp.removeOne(toRemove);
m_characterListModel->setStringList(tmp); m_characterListModel->setStringList(tmp);
} }
}); });
characterButtonLayout->addWidget(removeCharacterButton); characterButtonLayout->addWidget(removeCharacterButton);
auto tagLayout = new QVBoxLayout(); auto tagLayout = new QVBoxLayout();
formLayout->addRow(QStringLiteral("Tags"), tagLayout); formLayout->addRow(i18nc("@title:group", "Tags"), tagLayout);
auto tagsList = new QListView(); auto tagsList = new QListView();
m_tagsListModel = new QStringListModel(); m_tagsListModel = new QStringListModel();
tagsList->setModel(m_tagsListModel); tagsList->setModel(m_tagsListModel);
tagLayout->addWidget(tagsList); tagLayout->addWidget(tagsList);
auto tagButtonLayout = new QHBoxLayout(); auto tagButtonLayout = new QHBoxLayout();
tagLayout->addLayout(tagButtonLayout); tagLayout->addLayout(tagButtonLayout);
auto addTagButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-add")), QStringLiteral("Add")); auto addTagButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-add")), i18nc("@action:button", "Add"));
connect(addTagButton, &QPushButton::clicked, this, [this] { connect(addTagButton, &QPushButton::clicked, this, [this] {
auto tmp = m_tagsListModel->stringList();; auto tmp = m_tagsListModel->stringList();
tmp.push_back(QStringLiteral("New Tag")); ;
tmp.push_back(QStringLiteral("New Tag"));
m_tagsListModel->setStringList(tmp); m_tagsListModel->setStringList(tmp);
}); });
tagButtonLayout->addWidget(addTagButton); tagButtonLayout->addWidget(addTagButton);
tagButtonLayout->addStretch(1); tagButtonLayout->addStretch(1);
auto removeTagButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-remove")), QStringLiteral("Remove")); auto removeTagButton = new QPushButton(QIcon::fromTheme(QStringLiteral("list-remove")), i18nc("@action:button", "Remove"));
connect(removeTagButton, &QPushButton::clicked, this, [this, tagsList] { connect(removeTagButton, &QPushButton::clicked, this, [this, tagsList] {
if(tagsList->selectionModel()->hasSelection()) { if (tagsList->selectionModel()->hasSelection()) {
const QString toRemove = tagsList->selectionModel()->selectedRows()[0].data().toString(); const QString toRemove = tagsList->selectionModel()->selectedRows()[0].data().toString();
auto tmp = m_tagsListModel->stringList(); auto tmp = m_tagsListModel->stringList();
tmp.removeOne(toRemove); tmp.removeOne(toRemove);
m_tagsListModel->setStringList(tmp); m_tagsListModel->setStringList(tmp);
} }
}); });
tagButtonLayout->addWidget(removeTagButton); tagButtonLayout->addWidget(removeTagButton);
auto bottomButtonLayout = new QHBoxLayout(); auto bottomButtonLayout = new QHBoxLayout();
formLayout->addRow(bottomButtonLayout); formLayout->addRow(bottomButtonLayout);
auto cancelButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-close")), QStringLiteral("Cancel")); auto cancelButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-close")), i18nc("@action:button", "Cancel"));
connect(cancelButton, &QPushButton::clicked, this, &ArtDetailWindow::close); connect(cancelButton, &QPushButton::clicked, this, &ArtDetailWindow::close);
bottomButtonLayout->addWidget(cancelButton); bottomButtonLayout->addWidget(cancelButton);
bottomButtonLayout->addStretch(1); bottomButtonLayout->addStretch(1);
auto saveButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-ok")), QStringLiteral("Save")); auto saveButton = new QPushButton(QIcon::fromTheme(QStringLiteral("dialog-ok")), i18nc("@action:button", "Save"));
connect(saveButton, &QPushButton::clicked, this, [this, filename] { connect(saveButton, &QPushButton::clicked, this, [this, filename] {
saveData(filename); saveData(filename);
}); });
bottomButtonLayout->addWidget(saveButton); bottomButtonLayout->addWidget(saveButton);
if(QFile::exists(filename)) { if(QFile::exists(filename)) {
loadData(filename); loadData(filename);
} }
} }

View file

@ -4,6 +4,7 @@
#include "ArtModel.h" #include "ArtModel.h"
#include <KLocalizedString>
#include <QDirIterator> #include <QDirIterator>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
@ -53,11 +54,13 @@ ArtModel::ArtModel(const QString& definitionDirectory, const QString& assetDirec
} }
int ArtModel::rowCount(const QModelIndex &parent) const { int ArtModel::rowCount(const QModelIndex &parent) const {
return m_artPieces.size(); Q_UNUSED(parent);
return m_artPieces.size();
} }
int ArtModel::columnCount(const QModelIndex &parent) const { int ArtModel::columnCount(const QModelIndex &parent) const {
return 4; Q_UNUSED(parent);
return 4;
} }
QVariant ArtModel::data(const QModelIndex &index, int role) const { QVariant ArtModel::data(const QModelIndex &index, int role) const {
@ -95,16 +98,16 @@ QVariant ArtModel::headerData(int section, Qt::Orientation orientation, int role
if (orientation == Qt::Orientation::Horizontal && role == Qt::DisplayRole) { if (orientation == Qt::Orientation::Horizontal && role == Qt::DisplayRole) {
switch(section) { switch(section) {
case 0: case 0:
return QStringLiteral("Filename"); return i18nc("@title:column", "Filename");
case 1: case 1:
return QStringLiteral("Image"); return i18nc("@title:column", "Image");
case 2: case 2:
return QStringLiteral("Title"); return i18nc("@title:column", "Title");
case 3: case 3:
return QStringLiteral("Has Alt Text"); return i18nc("@title:column", "Has Alt Text");
default: default:
Q_UNREACHABLE(); Q_UNREACHABLE();
} }
} }
return QAbstractTableModel::headerData(section, orientation, role); return QAbstractTableModel::headerData(section, orientation, role);

View file

@ -4,32 +4,33 @@
#include "MainWindow.h" #include "MainWindow.h"
#include <QTableView> #include <KLocalizedString>
#include <QHeaderView> #include <QHeaderView>
#include <QMenuBar> #include <QMenuBar>
#include <QTableView>
#include "ArtConfigWindow.h" #include "ArtConfigWindow.h"
#include "ArtDetailWindow.h" #include "ArtDetailWindow.h"
#include "ArtModel.h" #include "ArtModel.h"
MainWindow::MainWindow(const QString& definitionDirectory, const QString& assetDirectory, const QString& dataDirectory) { MainWindow::MainWindow(const QString& definitionDirectory, const QString& assetDirectory, const QString& dataDirectory) {
setWindowTitle(QStringLiteral("Redai")); setWindowTitle(i18nc("@title:window", "Redai"));
setMinimumSize(1280, 720); setMinimumSize(1280, 720);
auto menuBar = new QMenuBar(); auto menuBar = new QMenuBar();
setMenuBar(menuBar); setMenuBar(menuBar);
auto manageMenu = menuBar->addMenu(QStringLiteral("Manage")); auto manageMenu = menuBar->addMenu(i18nc("@title:menu Manage site", "Manage"));
auto editConfigAction = manageMenu->addAction(QStringLiteral("Edit Config...")); auto editConfigAction = manageMenu->addAction(i18nc("@action:inmenu", "Edit Config..."));
connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory] { connect(editConfigAction, &QAction::triggered, this, [this, dataDirectory] {
auto window = new ArtConfigWindow(QStringLiteral("%1/art-config.json").arg(dataDirectory), this); auto window = new ArtConfigWindow(QStringLiteral("%1/art-config.json").arg(dataDirectory), this);
window->show(); window->show();
}); });
auto model = new ArtModel(definitionDirectory, assetDirectory); auto model = new ArtModel(definitionDirectory, assetDirectory);
auto pieceListView = new QTableView(); auto pieceListView = new QTableView();
pieceListView->setModel(model); pieceListView->setModel(model);
pieceListView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows); pieceListView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows);
pieceListView->setSelectionMode(QAbstractItemView::SingleSelection); pieceListView->setSelectionMode(QAbstractItemView::SingleSelection);

View file

@ -28,6 +28,8 @@ QPixmap ImageLabel::scaledPixmap() const {
} }
void ImageLabel::resizeEvent(QResizeEvent *e) { void ImageLabel::resizeEvent(QResizeEvent *e) {
if (!pix.isNull()) Q_UNUSED(e);
QLabel::setPixmap(scaledPixmap()); if (!pix.isNull()) {
QLabel::setPixmap(scaledPixmap());
}
} }

View file

@ -2,6 +2,7 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
#include <KLocalizedString>
#include <QApplication> #include <QApplication>
#include <QCommandLineParser> #include <QCommandLineParser>
#include <QDir> #include <QDir>
@ -9,15 +10,20 @@
#include "MainWindow.h" #include "MainWindow.h"
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QApplication app(argc, argv); QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
QCommandLineParser parser; QApplication app(argc, argv);
parser.addPositionalArgument(QStringLiteral("site-path"), QCoreApplication::translate("main", "Site directory."));
parser.process(app); KLocalizedString::setApplicationDomain("redai");
const auto args = parser.positionalArguments(); QCommandLineParser parser;
if (args.empty()) { parser.addPositionalArgument(QStringLiteral("site-path"), i18nc("@info", "Site directory."));
parser.process(app);
const auto args = parser.positionalArguments();
if (args.empty()) {
return -1; return -1;
} }