mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-23 04:27:45 +00:00
sagasu: Support localization
This commit is contained in:
parent
76f8b4859c
commit
a460e46595
5 changed files with 45 additions and 40 deletions
|
@ -1,6 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
|
// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
#include <QFormLayout>
|
#include <QFormLayout>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QTreeWidget>
|
#include <QTreeWidget>
|
||||||
|
@ -10,19 +11,19 @@
|
||||||
FilePropertiesWindow::FilePropertiesWindow(const QString &path, physis_Buffer buffer, QWidget *parent)
|
FilePropertiesWindow::FilePropertiesWindow(const QString &path, physis_Buffer buffer, QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
{
|
{
|
||||||
setWindowTitle(QStringLiteral("Properties for ") + path);
|
setWindowTitle(i18nc("@title:window", "Properties for ") + path);
|
||||||
|
|
||||||
auto layout = new QFormLayout();
|
auto layout = new QFormLayout();
|
||||||
setLayout(layout);
|
setLayout(layout);
|
||||||
|
|
||||||
auto pathLabel = new QLabel(path);
|
auto pathLabel = new QLabel(path);
|
||||||
layout->addRow(QStringLiteral("Path"), pathLabel);
|
layout->addRow(i18nc("@label", "Path"), pathLabel);
|
||||||
|
|
||||||
auto typeLabel = new QLabel(QStringLiteral("Unknown type"));
|
auto typeLabel = new QLabel(i18n("Unknown type"));
|
||||||
layout->addRow(QStringLiteral("Type"), typeLabel);
|
layout->addRow(i18nc("@label", "Type"), typeLabel);
|
||||||
|
|
||||||
auto sizeLabel = new QLabel(QString::number(buffer.size));
|
auto sizeLabel = new QLabel(QString::number(buffer.size));
|
||||||
layout->addRow(QStringLiteral("Size (in bytes)"), sizeLabel);
|
layout->addRow(i18nc("@label", "Size (in bytes)"), sizeLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "moc_filepropertieswindow.cpp"
|
#include "moc_filepropertieswindow.cpp"
|
|
@ -4,6 +4,7 @@
|
||||||
#include "filetreemodel.h"
|
#include "filetreemodel.h"
|
||||||
#include "physis.hpp"
|
#include "physis.hpp"
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
#include <QtConcurrent>
|
#include <QtConcurrent>
|
||||||
|
|
||||||
FileTreeModel::FileTreeModel(HashDatabase &database, bool showUnknown, const QString &gamePath, GameData *data, QObject *parent)
|
FileTreeModel::FileTreeModel(HashDatabase &database, bool showUnknown, const QString &gamePath, GameData *data, QObject *parent)
|
||||||
|
@ -121,13 +122,13 @@ QVariant FileTreeModel::data(const QModelIndex &index, int role) const
|
||||||
} else if (role == Qt::DisplayRole) {
|
} else if (role == Qt::DisplayRole) {
|
||||||
if (item->type == TreeType::Folder) {
|
if (item->type == TreeType::Folder) {
|
||||||
if (item->name.isEmpty()) {
|
if (item->name.isEmpty()) {
|
||||||
return QStringLiteral("Unknown Folder (%1)").arg(item->hash);
|
return i18n("Unknown Folder (%1)").arg(item->hash);
|
||||||
} else {
|
} else {
|
||||||
return item->name;
|
return item->name;
|
||||||
}
|
}
|
||||||
} else if (item->type == TreeType::File) {
|
} else if (item->type == TreeType::File) {
|
||||||
if (item->name.isEmpty()) {
|
if (item->name.isEmpty()) {
|
||||||
return QStringLiteral("Unknown File (%1)").arg(item->hash);
|
return i18n("Unknown File (%1)").arg(item->hash);
|
||||||
} else {
|
} else {
|
||||||
return item->name;
|
return item->name;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +142,7 @@ QVariant FileTreeModel::headerData(int section, Qt::Orientation orientation, int
|
||||||
{
|
{
|
||||||
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
|
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
|
||||||
if (section == 0) {
|
if (section == 0) {
|
||||||
return QStringLiteral("Name");
|
return i18nc("@title:column", "Name");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "filetreewindow.h"
|
#include "filetreewindow.h"
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
@ -27,7 +28,7 @@ FileTreeWindow::FileTreeWindow(HashDatabase &database, const QString &gamePath,
|
||||||
layout->addLayout(searchLayout);*/
|
layout->addLayout(searchLayout);*/
|
||||||
|
|
||||||
auto searchEdit = new QLineEdit();
|
auto searchEdit = new QLineEdit();
|
||||||
searchEdit->setPlaceholderText(QStringLiteral("Search..."));
|
searchEdit->setPlaceholderText(i18nc("@info:placeholder", "Search…"));
|
||||||
searchEdit->setClearButtonEnabled(true);
|
searchEdit->setClearButtonEnabled(true);
|
||||||
searchEdit->setProperty("_breeze_borders_sides", QVariant::fromValue(QFlags{Qt::BottomEdge}));
|
searchEdit->setProperty("_breeze_borders_sides", QVariant::fromValue(QFlags{Qt::BottomEdge}));
|
||||||
connect(searchEdit, &QLineEdit::textChanged, this, [this](const QString &text) {
|
connect(searchEdit, &QLineEdit::textChanged, this, [this](const QString &text) {
|
||||||
|
@ -56,7 +57,7 @@ FileTreeWindow::FileTreeWindow(HashDatabase &database, const QString &gamePath,
|
||||||
|
|
||||||
auto menu = new QMenu();
|
auto menu = new QMenu();
|
||||||
|
|
||||||
auto extractAction = menu->addAction(QStringLiteral("Extract..."));
|
auto extractAction = menu->addAction(i18nc("@action:inmenu", "Extract…"));
|
||||||
extractAction->setIcon(QIcon::fromTheme(QStringLiteral("archive-extract-symbolic")));
|
extractAction->setIcon(QIcon::fromTheme(QStringLiteral("archive-extract-symbolic")));
|
||||||
connect(extractAction, &QAction::triggered, this, [this, path] {
|
connect(extractAction, &QAction::triggered, this, [this, path] {
|
||||||
Q_EMIT extractFile(path);
|
Q_EMIT extractFile(path);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
#include <physis.hpp>
|
#include <physis.hpp>
|
||||||
#include <physis_logger.h>
|
#include <physis_logger.h>
|
||||||
|
|
||||||
|
@ -17,7 +18,7 @@ int main(int argc, char *argv[])
|
||||||
customizeAboutData(QStringLiteral("sagasu"),
|
customizeAboutData(QStringLiteral("sagasu"),
|
||||||
QStringLiteral("zone.xiv.sagasu"),
|
QStringLiteral("zone.xiv.sagasu"),
|
||||||
QStringLiteral("Data Explorer"),
|
QStringLiteral("Data Explorer"),
|
||||||
QStringLiteral("Program to explore FFXIV data archives."));
|
i18n("Program to explore FFXIV data archives."));
|
||||||
|
|
||||||
// Default to a sensible message pattern
|
// Default to a sensible message pattern
|
||||||
if (qEnvironmentVariableIsEmpty("QT_MESSAGE_PATTERN")) {
|
if (qEnvironmentVariableIsEmpty("QT_MESSAGE_PATTERN")) {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
#include <KZip>
|
#include <KZip>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
|
@ -43,7 +44,8 @@ MainWindow::MainWindow(const QString &gamePath, GameData *data)
|
||||||
connect(m_tree, &FileTreeWindow::extractFile, this, [this, data](const QString &path) {
|
connect(m_tree, &FileTreeWindow::extractFile, this, [this, data](const QString &path) {
|
||||||
const QFileInfo info(path);
|
const QFileInfo info(path);
|
||||||
|
|
||||||
const QString savePath = QFileDialog::getSaveFileName(this, tr("Save File"), info.fileName(), QStringLiteral("*.%1").arg(info.completeSuffix()));
|
const QString savePath =
|
||||||
|
QFileDialog::getSaveFileName(this, i18nc("@title:window", "Save File"), info.fileName(), QStringLiteral("*.%1").arg(info.completeSuffix()));
|
||||||
if (!savePath.isEmpty()) {
|
if (!savePath.isEmpty()) {
|
||||||
qInfo() << "Saving to" << savePath;
|
qInfo() << "Saving to" << savePath;
|
||||||
|
|
||||||
|
@ -84,57 +86,57 @@ void MainWindow::refreshParts(const QString &path)
|
||||||
if (info.completeSuffix() == QStringLiteral("exl")) {
|
if (info.completeSuffix() == QStringLiteral("exl")) {
|
||||||
auto exlWidget = new EXLPart(data);
|
auto exlWidget = new EXLPart(data);
|
||||||
exlWidget->load(file);
|
exlWidget->load(file);
|
||||||
partHolder->addTab(exlWidget, QStringLiteral("Excel List"));
|
partHolder->addTab(exlWidget, i18nc("@title:tab", "Excel List"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("exh")) {
|
} else if (info.completeSuffix() == QStringLiteral("exh")) {
|
||||||
auto exdWidget = new EXDPart(data);
|
auto exdWidget = new EXDPart(data);
|
||||||
exdWidget->loadSheet(info.baseName(), file);
|
exdWidget->loadSheet(info.baseName(), file);
|
||||||
partHolder->addTab(exdWidget, QStringLiteral("Excel Sheet"));
|
partHolder->addTab(exdWidget, i18nc("@title:tab", "Excel Sheet"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("exd")) {
|
} else if (info.completeSuffix() == QStringLiteral("exd")) {
|
||||||
auto exdWidget = new QLabel(QStringLiteral("Note: Excel data files cannot be previewed standalone, select the EXH file instead."));
|
auto exdWidget = new QLabel(i18n("Note: Excel data files cannot be previewed standalone, select the EXH file instead."));
|
||||||
partHolder->addTab(exdWidget, QStringLiteral("Note"));
|
partHolder->addTab(exdWidget, i18nc("@title:tab", "Note"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("mdl")) {
|
} else if (info.completeSuffix() == QStringLiteral("mdl")) {
|
||||||
auto mdlWidget = new MDLPart(data, fileCache);
|
auto mdlWidget = new MDLPart(data, fileCache);
|
||||||
mdlWidget->addModel(physis_mdl_parse(file), false, glm::vec3(), QStringLiteral("mdl"), {}, 0);
|
mdlWidget->addModel(physis_mdl_parse(file), false, glm::vec3(), QStringLiteral("mdl"), {}, 0);
|
||||||
partHolder->addTab(mdlWidget, QStringLiteral("Model"));
|
partHolder->addTab(mdlWidget, i18nc("@title:tab", "Model"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("tex") || info.completeSuffix() == QStringLiteral("atex")) {
|
} else if (info.completeSuffix() == QStringLiteral("tex") || info.completeSuffix() == QStringLiteral("atex")) {
|
||||||
auto texWidget = new TexPart(data);
|
auto texWidget = new TexPart(data);
|
||||||
texWidget->load(file);
|
texWidget->load(file);
|
||||||
partHolder->addTab(texWidget, QStringLiteral("Texture"));
|
partHolder->addTab(texWidget, i18nc("@title:tab", "Texture"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("shpk")) {
|
} else if (info.completeSuffix() == QStringLiteral("shpk")) {
|
||||||
auto shpkWidget = new SHPKPart(data);
|
auto shpkWidget = new SHPKPart(data);
|
||||||
shpkWidget->load(file);
|
shpkWidget->load(file);
|
||||||
partHolder->addTab(shpkWidget, QStringLiteral("Shader Package"));
|
partHolder->addTab(shpkWidget, i18nc("@title:tab", "Shader Package"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("cmp")) {
|
} else if (info.completeSuffix() == QStringLiteral("cmp")) {
|
||||||
auto cmpWidget = new CmpPart(data);
|
auto cmpWidget = new CmpPart(data);
|
||||||
cmpWidget->load(file);
|
cmpWidget->load(file);
|
||||||
partHolder->addTab(cmpWidget, QStringLiteral("Chara Make Params"));
|
partHolder->addTab(cmpWidget, i18nc("@title:tab", "Chara Make Params"));
|
||||||
} else if (info.completeSuffix() == QStringLiteral("sklb")) {
|
} else if (info.completeSuffix() == QStringLiteral("sklb")) {
|
||||||
auto sklbWidget = new SklbPart();
|
auto sklbWidget = new SklbPart();
|
||||||
sklbWidget->load(physis_parse_skeleton(file));
|
sklbWidget->load(physis_parse_skeleton(file));
|
||||||
partHolder->addTab(sklbWidget, QStringLiteral("Skeleton"));
|
partHolder->addTab(sklbWidget, i18nc("@title:tab", "Skeleton"));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto hexWidget = new HexPart();
|
auto hexWidget = new HexPart();
|
||||||
hexWidget->loadFile(file);
|
hexWidget->loadFile(file);
|
||||||
partHolder->addTab(hexWidget, QStringLiteral("Raw Hex"));
|
partHolder->addTab(hexWidget, i18nc("@title:tab", "Raw Hex"));
|
||||||
|
|
||||||
auto propertiesWidget = new FilePropertiesWindow(path, file);
|
auto propertiesWidget = new FilePropertiesWindow(path, file);
|
||||||
partHolder->addTab(propertiesWidget, QStringLiteral("Properties"));
|
partHolder->addTab(propertiesWidget, i18nc("@title:tab", "Properties"));
|
||||||
|
|
||||||
partHolder->tabBar()->setExpanding(true);
|
partHolder->tabBar()->setExpanding(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::setupFileMenu(QMenu *menu)
|
void MainWindow::setupFileMenu(QMenu *menu)
|
||||||
{
|
{
|
||||||
auto openList = menu->addAction(QStringLiteral("Import Path List..."));
|
auto openList = menu->addAction(i18nc("@action:inmenu", "Import Path List…"));
|
||||||
openList->setIcon(QIcon::fromTheme(QStringLiteral("document-open")));
|
openList->setIcon(QIcon::fromTheme(QStringLiteral("document-open")));
|
||||||
connect(openList, &QAction::triggered, [this] {
|
connect(openList, &QAction::triggered, [this] {
|
||||||
auto fileName = QFileDialog::getOpenFileName(nullptr, QStringLiteral("Open Path List"), QStringLiteral("~"));
|
auto fileName = QFileDialog::getOpenFileName(nullptr, i18nc("@title:window", "Open Path List"), QStringLiteral("~"));
|
||||||
|
|
||||||
QMessageBox::warning(this,
|
QMessageBox::warning(this,
|
||||||
QStringLiteral("Import Warning"),
|
i18nc("@title:window", "Import Warning"),
|
||||||
QStringLiteral("Depending on the size of the import, this process usually takes a few minutes. The program may freeze. Please "
|
i18n("Depending on the size of the import, this process usually takes a few minutes. The program may freeze. Please "
|
||||||
"keep it open until the operation is finished."),
|
"keep it open until the operation is finished."),
|
||||||
QMessageBox::Ok,
|
QMessageBox::Ok,
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
|
|
||||||
|
@ -144,20 +146,19 @@ void MainWindow::setupFileMenu(QMenu *menu)
|
||||||
m_database.importFileList(file.readAll());
|
m_database.importFileList(file.readAll());
|
||||||
m_tree->refreshModel();
|
m_tree->refreshModel();
|
||||||
|
|
||||||
QMessageBox::information(this, QStringLiteral("Import Complete"), QStringLiteral("Successfully imported path list!"), QMessageBox::Ok, QMessageBox::Ok);
|
QMessageBox::information(this, i18nc("@title:window", "Import Complete"), i18n("Successfully imported path list!"), QMessageBox::Ok, QMessageBox::Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
auto downloadList = menu->addAction(QStringLiteral("Download Path List..."));
|
auto downloadList = menu->addAction(i18nc("@action:inmenu", "Download Path List…"));
|
||||||
downloadList->setIcon(QIcon::fromTheme(QStringLiteral("download-symbolic")));
|
downloadList->setIcon(QIcon::fromTheme(QStringLiteral("download-symbolic")));
|
||||||
connect(downloadList, &QAction::triggered, [this] {
|
connect(downloadList, &QAction::triggered, [this] {
|
||||||
const int ret =
|
const int ret = QMessageBox::information(this,
|
||||||
QMessageBox::information(this,
|
i18nc("@title:window", "Download Confirmation"),
|
||||||
QStringLiteral("Download Confirmation"),
|
i18n("This will download the path list from <a "
|
||||||
QStringLiteral("This will download the path list from <a "
|
"href=\"https://rl2.perchbird.dev/\">ResLogger</a>.this process usually takes a few minutes. The program "
|
||||||
"href=\"https://rl2.perchbird.dev/\">ResLogger</a>.this process usually takes a few minutes. The program "
|
"may freeze. Please keep it open until the operation is finished.<br><br>Continue?"),
|
||||||
"may freeze. Please keep it open until the operation is finished.<br><br>Continue?"),
|
QMessageBox::Ok | QMessageBox::Cancel,
|
||||||
QMessageBox::Ok | QMessageBox::Cancel,
|
QMessageBox::Ok);
|
||||||
QMessageBox::Ok);
|
|
||||||
|
|
||||||
if (ret != QMessageBox::Ok) {
|
if (ret != QMessageBox::Ok) {
|
||||||
return;
|
return;
|
||||||
|
@ -194,8 +195,8 @@ void MainWindow::setupFileMenu(QMenu *menu)
|
||||||
archive.close();
|
archive.close();
|
||||||
|
|
||||||
QMessageBox::information(this,
|
QMessageBox::information(this,
|
||||||
QStringLiteral("Import Complete"),
|
i18nc("@title:window", "Import Complete"),
|
||||||
QStringLiteral("Successfully downloaded and imported path list!"),
|
i18n("Successfully downloaded and imported path list!"),
|
||||||
QMessageBox::Ok,
|
QMessageBox::Ok,
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue