mirror of
https://github.com/Qv2ray/Qv2ray.git
synced 2025-05-20 10:50:23 +08:00
[fix] prevented QTranslator leak, fixed #315
This commit is contained in:
parent
38d94d73d2
commit
531915d2c7
@ -143,6 +143,7 @@ Qv2rayAddSource(common, _, HTTPRequestHelper, cpp, hpp)
|
||||
Qv2rayAddSource(common, _, LogHighlighter, cpp, hpp)
|
||||
Qv2rayAddSource(common, _, QJsonModel, cpp, hpp)
|
||||
Qv2rayAddSource(common, _, QvHelpers, cpp, hpp)
|
||||
Qv2rayAddSource(common, _, QvTranslator, hpp)
|
||||
Qv2rayAddSource(components, autolaunch, QvAutoLaunch, cpp, hpp)
|
||||
Qv2rayAddSource(components, pac, QvGFWPACConverter, cpp)
|
||||
Qv2rayAddSource(components, pac, QvPACHandler, cpp, hpp)
|
||||
|
@ -22,5 +22,5 @@ namespace Qv2ray
|
||||
inline base::config::Qv2rayConfig GlobalConfig = base::config::Qv2rayConfig();
|
||||
inline base::QvStartupOptions StartupOption = base::QvStartupOptions();
|
||||
//
|
||||
inline QTranslator *Qv2rayTranslator;
|
||||
inline std::unique_ptr<QTranslator> Qv2rayTranslator;
|
||||
}
|
||||
|
@ -160,13 +160,6 @@ namespace Qv2ray::common
|
||||
return QString::fromStdString(_name);
|
||||
}
|
||||
|
||||
QTranslator *getTranslator(const QString &lang)
|
||||
{
|
||||
QTranslator *translator = new QTranslator();
|
||||
translator->load(lang + ".qm", ":/translations/");
|
||||
return translator;
|
||||
}
|
||||
|
||||
/// This returns a file name without extensions.
|
||||
void DeducePossibleFileName(const QString &baseDir, QString *fileName, const QString &extension)
|
||||
{
|
||||
|
@ -7,7 +7,6 @@
|
||||
|
||||
namespace Qv2ray::common
|
||||
{
|
||||
QTranslator *getTranslator(const QString &lang);
|
||||
QStringList GetFileList(QDir dir);
|
||||
QString Base64Encode(QString string);
|
||||
QString Base64Decode(QString string);
|
||||
|
21
src/common/QvTranslator.hpp
Normal file
21
src/common/QvTranslator.hpp
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
#include <QString>
|
||||
#include <QTranslator>
|
||||
#include <memory>
|
||||
|
||||
namespace Qv2ray::common
|
||||
{
|
||||
class QvTranslator
|
||||
{
|
||||
public:
|
||||
QvTranslator(const QString &lang)
|
||||
{
|
||||
QTranslator *translator = new QTranslator();
|
||||
translator->load(lang + ".qm", ":/translations/");
|
||||
this->pTranslator.reset(translator);
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<QTranslator> pTranslator;
|
||||
};
|
||||
} // namespace Qv2ray::common
|
13
src/main.cpp
13
src/main.cpp
@ -11,6 +11,7 @@
|
||||
#include "ui/w_MainWindow.hpp"
|
||||
#include "common/QvHelpers.hpp"
|
||||
#include "common/CommandArgs.hpp"
|
||||
#include "common/QvTranslator.hpp"
|
||||
|
||||
#ifdef Q_OS_UNIX
|
||||
// For unix root user check
|
||||
@ -222,7 +223,7 @@ int main(int argc, char *argv[])
|
||||
std::unique_ptr<QCoreApplication> consoleApp(new QCoreApplication(argc, argv));
|
||||
//
|
||||
// Install a default translater. From the OS/DE
|
||||
consoleApp->installTranslator(getTranslator(QLocale::system().name()));
|
||||
consoleApp->installTranslator(QvTranslator(QLocale::system().name()).pTranslator.get());
|
||||
QvCommandArgParser parser;
|
||||
QString errorMessage;
|
||||
|
||||
@ -280,10 +281,10 @@ int main(int argc, char *argv[])
|
||||
// Not duplicated.
|
||||
// Install a default translater. From the OS/DE
|
||||
auto _lang = QLocale::system().name();
|
||||
Qv2rayTranslator = getTranslator(_lang);
|
||||
Qv2rayTranslator = std::move(QvTranslator(_lang).pTranslator);
|
||||
//
|
||||
// Do not install en-US as it's the default language.
|
||||
bool _result_ = _qApp.installTranslator(Qv2rayTranslator);
|
||||
bool _result_ = _qApp.installTranslator(Qv2rayTranslator.get());
|
||||
LOG(UI, "Installing a tranlator from OS: " + _lang + " -- " + (_result_ ? "OK" : "Failed"))
|
||||
//
|
||||
LOG("LICENCE", NEWLINE "This program comes with ABSOLUTELY NO WARRANTY." NEWLINE
|
||||
@ -350,7 +351,7 @@ int main(int argc, char *argv[])
|
||||
// Load config object from upgraded config QJsonObject
|
||||
auto confObject = StructFromJsonString<Qv2rayConfig>(JsonToString(conf));
|
||||
// Remove system translator, for loading custom translations.
|
||||
qApp->removeTranslator(Qv2rayTranslator);
|
||||
qApp->removeTranslator(Qv2rayTranslator.get());
|
||||
LOG(INIT, "Removed system translations")
|
||||
|
||||
if (confObject.uiConfig.language.isEmpty()) {
|
||||
@ -359,9 +360,9 @@ int main(int argc, char *argv[])
|
||||
confObject.uiConfig.language = "en-US";
|
||||
}
|
||||
|
||||
Qv2rayTranslator = getTranslator(confObject.uiConfig.language);
|
||||
Qv2rayTranslator = std::move(QvTranslator(confObject.uiConfig.language).pTranslator);
|
||||
|
||||
if (qApp->installTranslator(Qv2rayTranslator)) {
|
||||
if (qApp->installTranslator(Qv2rayTranslator.get())) {
|
||||
LOG(INIT, "Successfully installed a translator for " + confObject.uiConfig.language)
|
||||
} else {
|
||||
// Do not translate these.....
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "core/kernel/KernelInteractions.hpp"
|
||||
#include "components/plugins/toolbar/QvToolbar.hpp"
|
||||
#include "components/autolaunch/QvAutoLaunch.hpp"
|
||||
#include <common/QvTranslator.hpp>
|
||||
|
||||
#define LOADINGCHECK if(!finishedLoading) return;
|
||||
#define NEEDRESTART if(finishedLoading) IsConnectionPropertyChanged = true;
|
||||
@ -233,11 +234,11 @@ void PreferencesWindow::on_buttonBox_accepted()
|
||||
this->exec();
|
||||
} else {
|
||||
if (CurrentConfig.uiConfig.language != GlobalConfig.uiConfig.language) {
|
||||
qApp->removeTranslator(Qv2rayTranslator);
|
||||
Qv2rayTranslator = getTranslator(CurrentConfig.uiConfig.language);
|
||||
qApp->removeTranslator(Qv2rayTranslator.get());
|
||||
Qv2rayTranslator = std::move(QvTranslator(CurrentConfig.uiConfig.language).pTranslator);
|
||||
|
||||
// Install translator
|
||||
if (!qApp->installTranslator(Qv2rayTranslator)) {
|
||||
if (!qApp->installTranslator(Qv2rayTranslator.get())) {
|
||||
LOG(UI, "Failed to translate UI to: " + CurrentConfig.uiConfig.language)
|
||||
} else {
|
||||
messageBus.EmitGlobalSignal(QvMessage::RETRANSLATE);
|
||||
|
Loading…
Reference in New Issue
Block a user