Browse Source

Apply the selected language immediately in first-run setup

master
evgeny 2 days ago
parent
commit
903568d9d6
  1. 63
      tools/chatgui/src/main.cpp

63
tools/chatgui/src/main.cpp

@ -11,6 +11,7 @@
#include <QLockFile> #include <QLockFile>
#include <QMessageBox> #include <QMessageBox>
#include <QTranslator> #include <QTranslator>
#include <QComboBox>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QHostInfo> #include <QHostInfo>
#include <QLabel> #include <QLabel>
@ -190,17 +191,23 @@ int main(int argc, char *argv[]) {
} }
QTranslator guiTranslator, qtTranslator; QTranslator guiTranslator, qtTranslator;
const QString language = resolveGuiLanguage(cfg.language()); auto loadLanguage = [&](const QString& selected) {
if (!guiTranslator.load(":/translations/chatgui_" + language + ".qm") || !app.installTranslator(&guiTranslator)) { app.removeTranslator(&guiTranslator);
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "GUI language: failed to load embedded catalog for %s", qPrintable(language)); app.removeTranslator(&qtTranslator);
return 1; if (!guiTranslator.load(":/translations/chatgui_" + selected + ".qm") || !app.installTranslator(&guiTranslator)) {
} DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "GUI language: failed to load embedded catalog for %s", qPrintable(selected));
if (language == "ru") { return false;
if (!qtTranslator.load(QStringLiteral(":/translations/qtbase_ru.qm")) || !app.installTranslator(&qtTranslator)) {
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "GUI language: failed to load embedded Qt Russian catalog");
return 1;
} }
} if (selected == "ru") {
if (!qtTranslator.load(QStringLiteral(":/translations/qtbase_ru.qm")) || !app.installTranslator(&qtTranslator)) {
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "GUI language: failed to load embedded Qt Russian catalog");
return false;
}
}
return true;
};
QString language = resolveGuiLanguage(cfg.language());
if (!loadLanguage(language)) return 1;
if (!locked) { if (!locked) {
QMessageBox::warning(nullptr, "vibechat", QCoreApplication::translate("ChatGui", "vibechat is already running.")); QMessageBox::warning(nullptr, "vibechat", QCoreApplication::translate("ChatGui", "vibechat is already running."));
return 1; return 1;
@ -210,23 +217,47 @@ int main(int argc, char *argv[]) {
const bool firstRun = !cfg.exists(); const bool firstRun = !cfg.exists();
if (firstRun) { if (firstRun) {
QDialog wizard; QDialog wizard;
wizard.setWindowTitle(QCoreApplication::translate("ChatGui", "Welcome to vibechat"));
wizard.setMinimumWidth(380); wizard.setMinimumWidth(380);
auto* layout = new QVBoxLayout(&wizard); auto* layout = new QVBoxLayout(&wizard);
layout->addWidget(new QLabel(QCoreApplication::translate("ChatGui", "Your nickname:"), &wizard)); auto* languageLabel = new QLabel(QStringLiteral("Language / Язык"), &wizard);
layout->addWidget(languageLabel);
auto* languageCombo = new QComboBox(&wizard);
languageCombo->addItem(QString(), QStringLiteral("system"));
languageCombo->addItem(QStringLiteral("English"), QStringLiteral("en"));
languageCombo->addItem(QStringLiteral("Русский"), QStringLiteral("ru"));
layout->addWidget(languageCombo);
auto* nicknameLabel = new QLabel(&wizard);
layout->addWidget(nicknameLabel);
auto* nickname = new QLineEdit(&wizard); auto* nickname = new QLineEdit(&wizard);
nickname->setMaxLength(32); nickname->setMaxLength(32);
const QString host = QHostInfo::localHostName(); const QString host = QHostInfo::localHostName();
nickname->setText(host.isEmpty() ? QStringLiteral("vibechat") : host); nickname->setText(host.isEmpty() ? QStringLiteral("vibechat") : host);
layout->addWidget(nickname); layout->addWidget(nickname);
auto* hint = new QLabel(QCoreApplication::translate("ChatGui", "Others will see this name. You can change it later in Settings."), &wizard); auto* hint = new QLabel(&wizard);
hint->setWordWrap(true); hint->setWordWrap(true);
layout->addWidget(hint); layout->addWidget(hint);
layout->addSpacing(12); layout->addSpacing(12);
auto* buttons = new QDialogButtonBox(QDialogButtonBox::Cancel, &wizard); auto* buttons = new QDialogButtonBox(QDialogButtonBox::Cancel, &wizard);
auto* start = buttons->addButton(QCoreApplication::translate("ChatGui", "Start chatting"), QDialogButtonBox::AcceptRole); auto* start = buttons->addButton(QString(), QDialogButtonBox::AcceptRole);
start->setDefault(true); start->setDefault(true);
layout->addWidget(buttons); layout->addWidget(buttons);
auto translateWizard = [&] {
wizard.setWindowTitle(QCoreApplication::translate("ChatGui", "Welcome to vibechat"));
languageCombo->setItemText(0, QCoreApplication::translate("ChatGui", "System language"));
nicknameLabel->setText(QCoreApplication::translate("ChatGui", "Your nickname:"));
hint->setText(QCoreApplication::translate("ChatGui", "Others will see this name. You can change it later in Settings."));
start->setText(QCoreApplication::translate("ChatGui", "Start chatting"));
};
translateWizard();
bool languageReady = true;
QObject::connect(languageCombo, qOverload<int>(&QComboBox::currentIndexChanged), &wizard, [&](int) {
const QString preference = languageCombo->currentData().toString();
language = resolveGuiLanguage(preference);
languageReady = loadLanguage(language);
if (!languageReady) { wizard.reject(); return; }
translateWizard();
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "First-run setup: language preference=%s selected=%s", qPrintable(preference), qPrintable(language));
});
QObject::connect(nickname, &QLineEdit::textChanged, &wizard, [start](const QString& text) { QObject::connect(nickname, &QLineEdit::textChanged, &wizard, [start](const QString& text) {
start->setEnabled(!text.trimmed().isEmpty()); start->setEnabled(!text.trimmed().isEmpty());
}); });
@ -243,11 +274,13 @@ int main(int argc, char *argv[]) {
QObject::connect(buttons, &QDialogButtonBox::rejected, &wizard, &QDialog::reject); QObject::connect(buttons, &QDialogButtonBox::rejected, &wizard, &QDialog::reject);
nickname->setFocus(); nickname->setFocus();
nickname->selectAll(); nickname->selectAll();
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "First-run setup: requesting nickname, config=%s", qPrintable(cfgPath)); DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "First-run setup: requesting nickname and language, config=%s", qPrintable(cfgPath));
if (wizard.exec() != QDialog::Accepted) { if (wizard.exec() != QDialog::Accepted) {
if (!languageReady) return 1;
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "First-run setup: cancelled, config not created"); DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "First-run setup: cancelled, config not created");
return 0; return 0;
} }
cfg.setLanguage(languageCombo->currentData().toString());
if (!cfg.create(nickname->text().trimmed(), 1333)) { if (!cfg.create(nickname->text().trimmed(), 1333)) {
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "First-run setup: failed to create config=%s", qPrintable(cfgPath)); DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "First-run setup: failed to create config=%s", qPrintable(cfgPath));
QMessageBox::critical(nullptr, wizard.windowTitle(), QMessageBox::critical(nullptr, wizard.windowTitle(),

Loading…
Cancel
Save