#include "../src/gui_language.h" #include "../src/networksettingspage.h" #include "../transport/node_config.h" #include "../transport/config_updater.h" #include "../../../lib/debug_config.h" #include #include #include #include #include #include #include #include #include class GuiLanguageTest : public QObject { Q_OBJECT private slots: void initTestCase() { debug_config_init(); } void systemPreference() { QCOMPARE(resolveGuiLanguage("system", {"ru-RU", "en-US"}), QString("ru")); QCOMPARE(resolveGuiLanguage("system", {"en-GB", "ru-RU"}), QString("en")); QCOMPARE(resolveGuiLanguage("system", {"de-DE", "ru_RU"}), QString("ru")); QCOMPARE(resolveGuiLanguage("system", {"fr-FR"}), QString("en")); QCOMPARE(resolveGuiLanguage("system", {}), QString("en")); QCOMPARE(resolveGuiLanguage("ru", {"en-US"}), QString("ru")); QCOMPARE(resolveGuiLanguage("en", {"ru-RU"}), QString("en")); } void preferencePersistence() { QTemporaryDir directory; QVERIFY(directory.isValid()); const QString path = directory.filePath("vibechat.cfg"); NodeConfig config(path); QVERIFY(config.create("Language test", 1333)); QCOMPARE(config.language(), QString("system")); for (const QString& language : {QString("ru"), QString("en"), QString("system")}) { QVERIFY(config_update_option(path, "gui", "language", language)); QVERIFY(config.load()); QVERIFY2(!config.hasErrors(), qPrintable(config.errors().join('\n'))); QCOMPARE(config.language(), language); QVERIFY(config.save()); NodeConfig reloaded(path); QVERIFY(reloaded.load()); QCOMPARE(reloaded.language(), language); QVERIFY(reloaded.saveFull()); QVERIFY(reloaded.load()); QCOMPARE(reloaded.language(), language); } QVERIFY(config_update_option(path, "gui", "language", "invalid")); QVERIFY(config.load()); QCOMPARE(config.language(), QString("system")); QVERIFY(config_update_option(path, "gui", "language", "ru")); QVERIFY(config.load()); QFile file(path); QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Truncate)); const QByteArray minimalConfig("[gui]\ndb_path=chat_data\n"); QCOMPARE(file.write(minimalConfig), qint64(minimalConfig.size())); file.close(); QVERIFY(config.load()); QCOMPARE(config.language(), QString("system")); } void embeddedCatalogs() { for (const QString& language : {QString("en"), QString("ru")}) { QTranslator translator; QVERIFY(translator.load(":/translations/chatgui_" + language + ".qm")); QVERIFY(qApp->installTranslator(&translator)); QCOMPARE(QCoreApplication::translate("ChatGui", "Settings"), language == "ru" ? QString("Настройки") : QString("Settings")); QFile file(QStringLiteral(GUI_TS_DIR) + "/chatgui_" + language + ".ts"); QVERIFY(file.open(QIODevice::ReadOnly)); QXmlStreamReader xml(&file); QString source; int count = 0; const QRegularExpression placeholders("%(?:L?[1-9][0-9]?|n)"); auto parameters = [&](const QString& text) { QStringList list; auto matches = placeholders.globalMatch(text); while (matches.hasNext()) list.append(matches.next().captured()); list.sort(); return list; }; while (!xml.atEnd()) { xml.readNext(); if (!xml.isStartElement()) continue; if (xml.name() == QLatin1String("source")) source = xml.readElementText(); if (xml.name() != QLatin1String("translation")) continue; QVERIFY(!xml.attributes().hasAttribute("type")); const QString translation = xml.readElementText(); QVERIFY2(!translation.isEmpty(), qPrintable(source)); QCOMPARE(parameters(translation), parameters(source)); QCOMPARE(QCoreApplication::translate("ChatGui", source.toUtf8().constData()), translation); if (language == "en") QCOMPARE(translation, source); count++; } QVERIFY2(!xml.hasError(), qPrintable(xml.errorString())); QVERIFY(count > 0); qApp->removeTranslator(&translator); } } void standardButtons() { QTranslator translator; QVERIFY(translator.load(":/translations/qtbase_ru.qm")); QVERIFY(qApp->installTranslator(&translator)); QDialogButtonBox buttons(QDialogButtonBox::Cancel | QDialogButtonBox::Save); QCOMPARE(buttons.button(QDialogButtonBox::Cancel)->text().remove('&'), QString("Отмена")); QCOMPARE(buttons.button(QDialogButtonBox::Save)->text().remove('&'), QString("Сохранить")); qApp->removeTranslator(&translator); } void translatedNetworkValues_data() { QTest::addColumn("language"); QTest::newRow("English") << QString("en"); QTest::newRow("Russian") << QString("ru"); } void translatedNetworkValues() { QFETCH(QString, language); QTranslator translator; QVERIFY(translator.load(":/translations/chatgui_" + language + ".qm")); QVERIFY(qApp->installTranslator(&translator)); QTemporaryDir directory; QVERIFY(directory.isValid()); const QString path = directory.filePath("vibechat.cfg"); QVERIFY(config_rewrite_servers(path, {{"test", "0.0.0.0:1333", "tcp", "private", ""}})); NetworkSettingsPage page; page.loadFromConfig(path); QComboBox* type = nullptr; for (auto* combo : page.findChildren()) { if (combo->findData(QString("public")) >= 0) type = combo; } QVERIFY(type); QCOMPARE(type->currentData().toString(), QString("private")); QCOMPARE(type->currentText(), language == "ru" ? QString("Частный") : QString("Private")); type->setCurrentIndex(type->findData(QString("local"))); page.saveToConfig(path); QFile file(path); QVERIFY(file.open(QIODevice::ReadOnly)); const QByteArray content = file.readAll(); QVERIFY(content.contains("type=local\n")); QVERIFY(content.contains("addr=0.0.0.0:1333\n")); QVERIFY(content.contains("transport=tcp\n")); QVERIFY(!content.contains("netif=")); qApp->removeTranslator(&translator); } }; QTEST_MAIN(GuiLanguageTest) #include "test_gui_language.moc"