Add English and Russian ChatGUI interface translations

This commit is contained in:
evgeny committed 2026-10-05 16:55:43 +02:00
1 parent 972c6b7f0a
commit 27d93ecaf9
50 files changed
+4978 -491

No files matched your search

+30 -11
View File
@@ -1,3 +1,4 @@
#include <QCoreApplication>
#include <QApplication>
#include <QIcon>
#include <QPalette>
@@ -6,6 +7,8 @@
#include <QFile>
#include <QLockFile>
#include <QMessageBox>
#include <QTranslator>
#include "gui_language.h"
#include <cstdio>
#ifdef _WIN32
#include <windows.h>
@@ -75,13 +78,11 @@ int main(int argc, char *argv[]) {
app.setDesktopFileName("org.utun.vibechat");
app.setWindowIcon(QIcon(":/icons/app_icon.png"));
app.setQuitOnLastWindowClosed(false);
debug_config_init();
/* single-instance: лог/БД/сокеты конфликтуют при втором запуске */
/* Блокировка до любых изменений конфига/БД; предупреждение после загрузки языка. */
QLockFile lock(QCoreApplication::applicationDirPath() + "/vibechat.lock");
if (!lock.tryLock()) {
QMessageBox::warning(nullptr, "vibechat", "vibechat is already running.");
return 1;
}
const bool locked = lock.tryLock();
app.setStyle(QStyleFactory::create("Fusion"));
QPalette p;
@@ -105,10 +106,31 @@ int main(int argc, char *argv[]) {
QString cfgDir = QCoreApplication::applicationDirPath();
QString cfgPath = cfgDir + "/vibechat.cfg";
/* миграция: старый конфиг chatgui.cfg → vibechat.cfg */
if (!QFile::exists(cfgPath) && QFile::exists(cfgDir + "/chatgui.cfg"))
if (locked && !QFile::exists(cfgPath) && QFile::exists(cfgDir + "/chatgui.cfg"))
QFile::rename(cfgDir + "/chatgui.cfg", cfgPath);
NodeConfig cfg(cfgPath);
if (cfg.exists() && !cfg.load()) {
qCritical("Cannot open/read config file: %s", qPrintable(cfgPath));
return 1;
}
QTranslator guiTranslator, qtTranslator;
const QString language = resolveGuiLanguage(cfg.language());
if (!guiTranslator.load(":/translations/chatgui_" + language + ".qm") || !app.installTranslator(&guiTranslator)) {
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "GUI language: failed to load embedded catalog for %s", qPrintable(language));
return 1;
}
if (language == "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 1;
}
}
if (!locked) {
QMessageBox::warning(nullptr, "vibechat", QCoreApplication::translate("ChatGui", "vibechat is already running."));
return 1;
}
bool needSave = false;
if (!cfg.exists()) {
@@ -117,10 +139,6 @@ int main(int argc, char *argv[]) {
return 1;
}
} else {
if (!cfg.load()) {
qCritical("Cannot open/read config file: %s", qPrintable(cfgPath));
return 1;
}
if (cfg.hasErrors()) {
for (const auto& err : cfg.errors())
fprintf(stderr, "CONFIG ERROR: %s\n", qPrintable(err));
@@ -154,12 +172,13 @@ int main(int argc, char *argv[]) {
/* ранняя инициализация лога в GUI-потоке: SoundManager::init() вызывается в
* конструкторе MainWindow ДО старта utun-потока, поэтому без этого его диагностика
* (ma_engine_init и т.п.) в лог-файл не попадёт. */
debug_config_init();
debug_enable_function_name(0);
debug_enable_file_output(debugFile.toUtf8().constData(), 0);
QString lvl = cfg.debugLevel().trimmed();
if (lvl.isEmpty()) lvl = QStringLiteral("info");
debug_apply_global_level(lvl.toUtf8().constData());
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "GUI language: preference=%s system=%s selected=%s",
qPrintable(cfg.language()), qPrintable(QLocale::system().uiLanguages().join(',')), qPrintable(language));
DbManager db;
MainWindow w(nullptr, &db, cfgPath, dbPath, debugFile,