diff --git a/Build.Counter b/Build.Counter index 7f7703d0..98ee87f4 100644 --- a/Build.Counter +++ b/Build.Counter @@ -1 +1 @@ -3157 +3166 diff --git a/Qv2ray.pro b/Qv2ray.pro index 6bca50c1..6a3249a5 100644 --- a/Qv2ray.pro +++ b/Qv2ray.pro @@ -60,12 +60,13 @@ SOURCES += \ src/QvCoreConfigOperations_Convertion.cpp \ src/QvCoreConfigOperations_Generation.cpp \ src/QvUtils.cpp \ - src/ui/routeNodeModels/QvInboundNodeModel.cpp \ - src/ui/routeNodeModels/QvOutboundNodeModel.cpp \ - src/ui/routeNodeModels/QvRuleNodeModel.cpp \ + src/ui/RouteNodeModels/QvInboundNodeModel.cpp \ + src/ui/RouteNodeModels/QvOutboundNodeModel.cpp \ + src/ui/RouteNodeModels/QvRuleNodeModel.cpp \ src/ui/w_MainWindow_extra.cpp \ src/ui/w_PreferencesWindow.cpp \ src/ui/w_RoutesEditor_extra.cpp \ + src/utils/QvGlobalVarsInstantiation.cpp \ src/utils/QvHelpers.cpp \ src/utils/QJsonModel.cpp \ src/ui/w_ExportConfig.cpp \ @@ -103,10 +104,10 @@ HEADERS += \ src/components/QvPACHandler.hpp \ src/components/QvSystemProxyConfigurator.hpp \ src/components/QvTCPing.hpp \ - src/ui/routeNodeModels/QvInboundNodeModel.hpp \ - src/ui/routeNodeModels/QvNodeModelsBase.hpp \ - src/ui/routeNodeModels/QvOutboundNodeModel.hpp \ - src/ui/routeNodeModels/QvRuleNodeModel.hpp \ + src/ui/RouteNodeModels/QvInboundNodeModel.hpp \ + src/ui/RouteNodeModels/QvNodeModelsBase.hpp \ + src/ui/RouteNodeModels/QvOutboundNodeModel.hpp \ + src/ui/RouteNodeModels/QvRuleNodeModel.hpp \ src/ui/w_ExportConfig.hpp \ src/ui/w_ImportConfig.hpp \ src/ui/w_InboundEditor.hpp \ @@ -118,6 +119,7 @@ HEADERS += \ src/ui/w_SubscriptionEditor.hpp \ src/ui/w_ScreenShot_Core.hpp \ src/utils/QvHelpers.hpp \ + src/utils/QvRuntimeConfig.hpp \ src/utils/QvTinyLog.hpp \ src/utils/QJsonModel.hpp \ src/utils/QJsonObjectInsertMacros.h diff --git a/src/Qv2rayBase.hpp b/src/Qv2rayBase.hpp index 330973c4..0c48742d 100644 --- a/src/Qv2rayBase.hpp +++ b/src/Qv2rayBase.hpp @@ -18,7 +18,7 @@ const int QV2RAY_CONFIG_VERSION = 8; # endif #endif -extern bool isDebug; +extern const bool isDebugBuild; // Base folder suffix. #ifdef QT_DEBUG # define QV2RAY_CONFIG_DIR_SUFFIX "_debug/" diff --git a/src/QvUtils.cpp b/src/QvUtils.cpp index d7970e8a..8bec0491 100644 --- a/src/QvUtils.cpp +++ b/src/QvUtils.cpp @@ -5,9 +5,6 @@ namespace Qv2ray { namespace Utils { - static bool _isQv2rayExiting = false; - Qv2rayConfig GlobalConfig = Qv2rayConfig(); - QString Qv2rayConfigPath = ""; void SaveGlobalConfig(Qv2rayConfig conf) { GlobalConfig = conf; @@ -31,21 +28,17 @@ namespace Qv2ray file.open(QFile::ReadOnly); QTextStream stream(&file); auto str = stream.readAll(); - auto config = StructFromJsonString(str); + auto config = StructFromJsonString(str); SaveGlobalConfig(config); file.close(); } void ExitQv2ray() { - _isQv2rayExiting = true; + isExiting = true; QApplication::quit(); } - bool isExiting() - { - return _isQv2rayExiting; - } tuple GetConnectionInfo(const CONFIGROOT &root) { bool validOutboundFound = false; diff --git a/src/QvUtils.hpp b/src/QvUtils.hpp index c52de8e7..ef5a583e 100644 --- a/src/QvUtils.hpp +++ b/src/QvUtils.hpp @@ -11,6 +11,7 @@ namespace Qv2ray { extern QString Qv2rayConfigPath; extern Qv2rayConfig GlobalConfig; + extern bool isExiting; // void SaveGlobalConfig(Qv2rayConfig conf); void LoadGlobalConfig(); @@ -27,7 +28,6 @@ namespace Qv2ray } void ExitQv2ray(); - bool isExiting(); tuple GetConnectionInfo(const CONFIGROOT &alias); bool GetOutboundData(const OUTBOUND &out, QString *host, int *port, QString *protocol); } diff --git a/src/components/QvCore/QvCommandLineArgs.cpp b/src/components/QvCore/QvCommandLineArgs.cpp index 61a3ae90..aab764a4 100644 --- a/src/components/QvCore/QvCommandLineArgs.cpp +++ b/src/components/QvCore/QvCommandLineArgs.cpp @@ -7,9 +7,6 @@ namespace Qv2ray { namespace CommandArgOperations { - // Instantiation - QvStartupOptions StartupOption = QvStartupOptions{}; - QvCommandArgParser::QvCommandArgParser() : QObject(), noAPIOption("noAPI", QObject::tr("Disable gRPC API subsystems.")), runAsRootOption("I-just-wanna-run-with-root", QObject::tr("Explicitly run Qv2ray as root.")), diff --git a/src/components/QvKernelInteractions.cpp b/src/components/QvKernelInteractions.cpp index b0881b08..21da6a72 100644 --- a/src/components/QvKernelInteractions.cpp +++ b/src/components/QvKernelInteractions.cpp @@ -242,6 +242,9 @@ namespace Qv2ray { KernelStarted = false; vProcess->close(); + // Block until V2ray core exits + // Should we use -1 instead of waiting for 30secs? + vProcess->waitForFinished(); killTimer(apiTimerId); apiFailedCounter = 0; transferData.clear(); diff --git a/src/components/QvTCPing.cpp b/src/components/QvTCPing.cpp index aa903ac8..36fd5d6c 100644 --- a/src/components/QvTCPing.cpp +++ b/src/components/QvTCPing.cpp @@ -42,7 +42,7 @@ namespace Qv2ray QvTCPingData QvTCPingModel::startTestLatency(QvTCPingData data, const int count) { - if (isExiting()) return QvTCPingData(); + if (isExiting) return QvTCPingData(); double successCount = 0, errorCount = 0; addrinfo *resolved; @@ -61,7 +61,7 @@ namespace Qv2ray int currentCount = 0; while (currentCount < count) { - if (isExiting()) return QvTCPingData(); + if (isExiting) return QvTCPingData(); timeval rtt; @@ -102,7 +102,7 @@ namespace Qv2ray int QvTCPingModel::resolveHost(const string &host, int port, addrinfo **res) { - if (isExiting()) return 0; + if (isExiting) return 0; addrinfo hints; #ifdef _WIN32 @@ -120,7 +120,7 @@ namespace Qv2ray int QvTCPingModel::testLatency(struct addrinfo *addr, struct timeval *rtt) { - if (isExiting()) return 0; + if (isExiting) return 0; int fd; struct timeval start; @@ -131,7 +131,7 @@ namespace Qv2ray /* try to connect for each of the entries: */ while (addr != nullptr) { - if (isExiting()) return 0; + if (isExiting) return 0; /* create socket */ if ((fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol)) == -1) diff --git a/src/main.cpp b/src/main.cpp index d19eafbf..15794fd9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,9 +16,6 @@ #include "unistd.h" #endif -bool isDebug = false; - - void signalHandler(int signum) { cout << "Interrupt signal (" << signum << ") received." << endl; @@ -269,12 +266,10 @@ int main(int argc, char *argv[]) // #ifdef QT_DEBUG // ----------------------------> For debug build... - isDebug = true; SingleApplication::setApplicationName("Qv2ray - DEBUG"); #endif - // - if (StartupOption.debugLog) { + if (isDebugBuild || StartupOption.debugLog) { DEBUG(MODULE_INIT, "Debug log enabled") } diff --git a/src/ui/routeNodeModels/QvInboundNodeModel.cpp b/src/ui/RouteNodeModels/QvInboundNodeModel.cpp similarity index 100% rename from src/ui/routeNodeModels/QvInboundNodeModel.cpp rename to src/ui/RouteNodeModels/QvInboundNodeModel.cpp diff --git a/src/ui/routeNodeModels/QvInboundNodeModel.hpp b/src/ui/RouteNodeModels/QvInboundNodeModel.hpp similarity index 100% rename from src/ui/routeNodeModels/QvInboundNodeModel.hpp rename to src/ui/RouteNodeModels/QvInboundNodeModel.hpp diff --git a/src/ui/routeNodeModels/QvNodeModelsBase.hpp b/src/ui/RouteNodeModels/QvNodeModelsBase.hpp similarity index 100% rename from src/ui/routeNodeModels/QvNodeModelsBase.hpp rename to src/ui/RouteNodeModels/QvNodeModelsBase.hpp diff --git a/src/ui/routeNodeModels/QvOutboundNodeModel.cpp b/src/ui/RouteNodeModels/QvOutboundNodeModel.cpp similarity index 100% rename from src/ui/routeNodeModels/QvOutboundNodeModel.cpp rename to src/ui/RouteNodeModels/QvOutboundNodeModel.cpp diff --git a/src/ui/routeNodeModels/QvOutboundNodeModel.hpp b/src/ui/RouteNodeModels/QvOutboundNodeModel.hpp similarity index 100% rename from src/ui/routeNodeModels/QvOutboundNodeModel.hpp rename to src/ui/RouteNodeModels/QvOutboundNodeModel.hpp diff --git a/src/ui/routeNodeModels/QvRuleNodeModel.cpp b/src/ui/RouteNodeModels/QvRuleNodeModel.cpp similarity index 100% rename from src/ui/routeNodeModels/QvRuleNodeModel.cpp rename to src/ui/RouteNodeModels/QvRuleNodeModel.cpp diff --git a/src/ui/routeNodeModels/QvRuleNodeModel.hpp b/src/ui/RouteNodeModels/QvRuleNodeModel.hpp similarity index 100% rename from src/ui/routeNodeModels/QvRuleNodeModel.hpp rename to src/ui/RouteNodeModels/QvRuleNodeModel.hpp diff --git a/src/ui/w_ImportConfig.cpp b/src/ui/w_ImportConfig.cpp index ba46aaa3..ad82ce00 100644 --- a/src/ui/w_ImportConfig.cpp +++ b/src/ui/w_ImportConfig.cpp @@ -18,6 +18,7 @@ #include "w_SubscriptionEditor.hpp" #include "w_RoutesEditor.hpp" +#include "QvRuntimeConfig.hpp" ImportConfigWindow::ImportConfigWindow(QWidget *parent) : QDialog(parent) @@ -25,6 +26,7 @@ ImportConfigWindow::ImportConfigWindow(QWidget *parent) setupUi(this); nameTxt->setText(QDateTime::currentDateTime().toString("MMdd_hhmm")); REGISTER_WINDOW + RESTORE_RUNTIME_CONFIG(screenShotHideQv2ray, hideQv2rayCB->setChecked) } ImportConfigWindow::~ImportConfigWindow() @@ -280,3 +282,9 @@ void ImportConfigWindow::on_routeEditBtn_clicked() return; } } + +void ImportConfigWindow::on_hideQv2rayCB_stateChanged(int arg1) +{ + Q_UNUSED(arg1) + SET_RUNTIME_CONFIG(screenShotHideQv2ray, hideQv2rayCB->isChecked) +} diff --git a/src/ui/w_ImportConfig.hpp b/src/ui/w_ImportConfig.hpp index 15255409..a1cbf0fe 100644 --- a/src/ui/w_ImportConfig.hpp +++ b/src/ui/w_ImportConfig.hpp @@ -34,6 +34,8 @@ class ImportConfigWindow : public QDialog, private Ui::ImportConfigWindow void on_routeEditBtn_clicked(); + void on_hideQv2rayCB_stateChanged(int arg1); + private: QMap connections; QMap vmessErrors; diff --git a/src/ui/w_RoutesEditor.cpp b/src/ui/w_RoutesEditor.cpp index 58c97bbf..c472d9fe 100644 --- a/src/ui/w_RoutesEditor.cpp +++ b/src/ui/w_RoutesEditor.cpp @@ -10,9 +10,17 @@ #include "w_InboundEditor.hpp" #include "w_ImportConfig.hpp" +#include "RouteNodeModels/QvRuleNodeModel.hpp" +#include "RouteNodeModels/QvInboundNodeModel.hpp" +#include "RouteNodeModels/QvOutboundNodeModel.hpp" + #include "NodeStyle.hpp" +#include "FlowView.hpp" #include "FlowViewStyle.hpp" +using QtNodes::FlowView; +using namespace Qv2ray::Components::Nodes; + static bool isLoading = false; #define CurrentRule this->rules[this->currentRuleTag] #define LOADINGCHECK if(isLoading) return; @@ -115,7 +123,7 @@ void RouteEditor::onNodeClicked(Node &n) { LOADINGCHECK - if (isExiting()) return; + if (isExiting) return; auto isOut = outboundNodes.values().contains(&n); auto isIn = inboundNodes.values().contains(&n); @@ -160,7 +168,7 @@ void RouteEditor::onConnectionCreated(QtNodes::Connection const &c) { LOADINGCHECK - if (isExiting()) return; + if (isExiting) return; // Connection Established auto const sourceNode = c.getNode(PortType::Out); @@ -211,7 +219,7 @@ void RouteEditor::onConnectionDeleted(QtNodes::Connection const &c) { LOADINGCHECK - if (isExiting()) return; + if (isExiting) return; // Connection Deleted auto const source = c.getNode(PortType::Out); diff --git a/src/ui/w_RoutesEditor.hpp b/src/ui/w_RoutesEditor.hpp index aa110d0e..31af4cb6 100644 --- a/src/ui/w_RoutesEditor.hpp +++ b/src/ui/w_RoutesEditor.hpp @@ -7,30 +7,14 @@ #include #include "QvUtils.hpp" -#include "Node.hpp" -#include "FlowScene.hpp" -#include "FlowView.hpp" -#include "ConnectionStyle.hpp" - #include "Node.hpp" #include "NodeData.hpp" +#include "ConnectionStyle.hpp" #include "FlowScene.hpp" -#include "FlowView.hpp" -#include "DataModelRegistry.hpp" -#include "routeNodeModels/QvRuleNodeModel.hpp" -#include "routeNodeModels/QvInboundNodeModel.hpp" -#include "routeNodeModels/QvOutboundNodeModel.hpp" - -using QtNodes::DataModelRegistry; -using QtNodes::FlowScene; -using QtNodes::FlowView; using QtNodes::Node; +using QtNodes::FlowScene; using QtNodes::ConnectionStyle; -using QtNodes::TypeConverter; -using QtNodes::TypeConverterId; - -using namespace Qv2ray::Components::Nodes; #include "ui_w_RoutesEditor.h" diff --git a/src/ui/w_ScreenShot_Core.cpp b/src/ui/w_ScreenShot_Core.cpp index 923cdda1..22b2218b 100644 --- a/src/ui/w_ScreenShot_Core.cpp +++ b/src/ui/w_ScreenShot_Core.cpp @@ -63,7 +63,6 @@ QImage ScreenShotWindow::DoScreenShot() setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); this->showFullScreen(); this->exec(); - this->close(); return resultImage; } diff --git a/src/utils/QvGlobalVarsInstantiation.cpp b/src/utils/QvGlobalVarsInstantiation.cpp new file mode 100644 index 00000000..e57e6aa5 --- /dev/null +++ b/src/utils/QvGlobalVarsInstantiation.cpp @@ -0,0 +1,30 @@ +// Instantiation for Qv2ray global objects. + +#include "Qv2rayBase.hpp" +#include "QvUtils.hpp" +#include "QvRuntimeConfig.hpp" +#include "QvCore/QvCommandLineArgs.hpp" + +// Global scope variable. +#ifdef QT_DEBUG +const bool isDebugBuild = true; +#else +const bool isDebugBuild = false; +#endif + +namespace Qv2ray +{ + namespace Utils + { + // Qv2ray runtime config + Qv2rayRuntimeConfig RuntimeConfig = Qv2rayRuntimeConfig(); + bool isExiting = false; + Qv2rayConfig GlobalConfig = Qv2rayConfig(); + QString Qv2rayConfigPath = ""; + } + + namespace CommandArgOperations + { + QvStartupOptions StartupOption = QvStartupOptions{}; + } +} diff --git a/src/utils/QvHelpers.cpp b/src/utils/QvHelpers.cpp index 2481f0f7..7542ddcc 100644 --- a/src/utils/QvHelpers.cpp +++ b/src/utils/QvHelpers.cpp @@ -9,7 +9,7 @@ void __QV2RAY_LOG_FUNC__(int type, const std::string &func, int line, const QStr { auto logString = "[" + module + "]: " + log; - if (StartupOption.debugLog || (isDebug && type == QV2RAY_LOG_DEBUG)) { + if (StartupOption.debugLog || (isDebugBuild && type == QV2RAY_LOG_DEBUG)) { logString.prepend(QString::fromStdString(func + ":" + to_string(line) + " ")); } diff --git a/src/utils/QvRuntimeConfig.hpp b/src/utils/QvRuntimeConfig.hpp new file mode 100644 index 00000000..b8ea0b4c --- /dev/null +++ b/src/utils/QvRuntimeConfig.hpp @@ -0,0 +1,17 @@ +#ifndef QVRUNTIMECONFIG_HPP +#define QVRUNTIMECONFIG_HPP + +#define SET_RUNTIME_CONFIG(conf, val) RuntimeConfig.conf = val(); +#define RESTORE_RUNTIME_CONFIG(conf, func) func(RuntimeConfig.conf); + +namespace Qv2ray +{ + namespace Utils + { + struct Qv2rayRuntimeConfig { + bool screenShotHideQv2ray; + }; + extern Qv2rayRuntimeConfig RuntimeConfig; + } +} +#endif // QVRUNTIMECONFIG_HPP diff --git a/translations/en_US.ts b/translations/en_US.ts index af0531dd..82dcd4bc 100644 --- a/translations/en_US.ts +++ b/translations/en_US.ts @@ -4,28 +4,28 @@ ConfigExporter - + Empty - + Save Image - + Share Connection - + Image has been copied to the clipboard. - + VMess string has been copied to the clipboard. @@ -91,12 +91,22 @@ - + + secs + + + + + Hide Qv2ray + + + + Subscription Link - + Import @@ -152,139 +162,134 @@ - + Go - + After - - second(s). - - - - + Place your vmess:// here, one line for each. - + Error List - + VMess - + Subscriptions / Manually Input - + Manually Input Connections - + Route Editor - + Open Route Editor - + Subscription Manager - + Open Subscription Manager - + Connection Editor - + Open Connection Editor - + Cancel - + Select file to import - + Capture QRCode - + Cannot find a valid QRCode from this region. - + Import config file - + Failed to check the validity of the config file. - + Select an image to import - + QRCode scanning failed - + Cannot find any QRCode from the image. - - - + + + Edit file as JSON - + Provided file not found: - + The file you selected has json syntax error. Continue editing may make you lose data. Would you like to continue? - + Failed to save file, please check if you have proper permissions @@ -531,41 +536,41 @@ - + Inbound type not supported - + The inbound type is not supported by Qv2ray (yet). Please use JsonEditor to change the settings - + Inbound: - - + + Removing a user - - + + You haven't selected a user yet. - - + + Add a user - - + + This user exists already. @@ -598,28 +603,28 @@ - - + + Json Contains Syntax Errors - + Original Json may contain syntax errors. Json tree is disabled. - + You must correct these errors before continue. - + Syntax Errors - + Please fix the JSON errors before continue @@ -839,7 +844,7 @@ - + Hide @@ -879,8 +884,8 @@ - - + + Show @@ -896,37 +901,37 @@ - - + + No connection selected! - - + + Please select a config from the list. - + Update - + Found a new version: - + Download Link: - - + + Connected: @@ -1007,44 +1012,44 @@ - + Disconnected - + Complex - + Simple - + No data - + ms - - - + + + N/A - - - + + + Rename a Connection @@ -1079,104 +1084,119 @@ - + Upload - + Download - + Ping - + Ping All - + Subscription - + + Already connected to: + + + + + Disconnected from: + + + + + Qv2ray is not connected + + + + The name cannot be empty - + The name has been used already, Please choose another. - + The name you suggested is not valid, please try another. - + Removing Connection(s) - + Are you sure to remove selected connection(s)? - - + + Removing this Connection - - + + Failed to delete connection file, please delete manually. - + Removing a subscription config - + Do you want to remove the config loaded from a subscription? - - - + + + No Config Selected - - - + + + Please Select a Config - + You are about to run latency test on all servers, do you want to continue? - + Testing... - + Latency Test @@ -1187,12 +1207,12 @@ - + Share Connection - + There're no support of sharing configs other than vmess @@ -1445,10 +1465,10 @@ PreferencesWindow - - - - + + + + Preferences @@ -1908,13 +1928,13 @@ p, li { white-space: pre-wrap; } - + Bold - + Italic @@ -1993,21 +2013,11 @@ p, li { white-space: pre-wrap; } Version: - - - <html><head/><body><p><a href="https://www.gnu.org/licenses/gpl-3.0.txt"><span style=" text-decoration: underline; color:#2980b9;">GPLv3 (https://www.gnu.org/licenses/gpl-3.0.txt)</span></a></p></body></html> - - Official Repo: - - - <html><head/><body><p><a href="https://github.com/lhy0403/Qv2ray"><span style=" text-decoration: underline; color:#2980b9;">https://github.com/lhy0403/Qv2ray</span></a></p></body></html> - - License: @@ -2034,132 +2044,147 @@ p, li { white-space: pre-wrap; } - + Use Darkmode Theme - + Page - + Item(s) - - + + Enable tProxy Support - - If anything goes wrong after enabling this, please refer to issue #57 or the link below: - - - - + to this path: - + Qv2ray Network Toolbar is disabled and still under test. Add --withNetworkToolbar to enable. - + Duplicated port numbers detected, please check the port number settings. - + Open V2ray assets folder - + Open V2ray core file - + This will append capabilities to the V2ray executable. - + Qv2ray will copy your V2ray core to this path: - + + If anything goes wrong after enabling this, please check issue #57 or the link below: + + + + Qv2ray cannot copy one or both V2ray files from: - - + + Failed to setcap onto V2ray executable. You may need to run `setcap` manually. - + tProxy is not supported on macOS and Windows - + + Apply network toolbar settings + + + + + All other modified settings will be applied as well after this object. + + + + + Do you want to continue? + + + + Dark Mode - + Please restart Qv2ray to fully apply this feature. - + Select GFWList in base64 - + Download GFWList - + Successfully downloaded GFWList. - - + + Start with boot - - + + Failed to set auto start option. - - + + V2ray Core Settings - + V2ray path configuration check passed. - + Current version of V2ray is: @@ -2182,124 +2207,124 @@ p, li { white-space: pre-wrap; } - + Warning - + Qv2ray cannot load the config file from here: - + Cannot Start Qv2ray - + Cannot find a place to store config files. - + Qv2ray has searched these paths below: - - - + + + Qv2ray will now exit. - + Failed to initialise Qv2ray - + Failed to determine the location of config file. - + Please report if you think it's a bug. - + You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so. - + --> USE IT AT YOUR OWN RISK! - + Cannot load languages - + Qv2ray will continue running, but you cannot change the UI language. - + Qv2ray Cannot Continue - + You are running a lower version of Qv2ray compared to the current config file. - + Please check if there's an issue explaining about it. - + Or submit a new issue if you think this is an error. - + Dependency Missing - + This could be caused by a missing of `openssl` package in your system. - + If you are using an AppImage from Github Action, please report a bug. - + Cannot find openssl libs - + Technical Details - + Connected - + Disconnected @@ -2400,34 +2425,34 @@ p, li { white-space: pre-wrap; } - - - + + + N/A - + Qv2ray - A cross-platform Qt frontend for V2ray. - + Disable gRPC API subsystems. - + Explicitly run Qv2ray as root. - + Enable Debug Output - + Enable Qv2ray network toolbar plugin @@ -2488,71 +2513,52 @@ p, li { white-space: pre-wrap; } - + V2ray core failed with an exit code: - + + V2ray core returns empty string. + + + + Cannot start V2ray - + Configuration Error - + V2ray core settings is incorrect. - + The error is: - + Failed to get statistics data, please check if V2ray is running properly - + API Call Failed - - QvInboundNodeModel - - - Missing or incorrect inputs - - - - - QvOutboundNodeModel - - - Missing or incorrect inputs - - - - - QvRuleNodeDataModel - - - Missing or incorrect inputs - - - RouteEditor - + Route Editor @@ -2816,47 +2822,47 @@ p, li { white-space: pre-wrap; } - - - + + + OK - + Cannot Edit - + This outbound entry is not supported by the GUI editor. - - + + We will launch Json Editor instead. - + Show rule details - + A rule cannot be found: - - - + + + Protocol list changed: - + Balancer is empty, not processing. @@ -2888,81 +2894,81 @@ p, li { white-space: pre-wrap; } - + To make this rule ready to use, you need to connect it to an outbound node. - + Remove Items - - + + Please select a node from the graph to continue. - + Error - + Qv2ray entered an unknown state. - + Edit Inbound/Outbound - - + + Edit Inbound - - + + No inbound tag found: - - + + Opening JSON editor - + Unsupported Outbound Type - + Opening default outbound editor. - + Added DIRECT outbound - + Currently, this type of outbound is not supported by the editor. - + Opening default inbound editor - + Removed a balancer entry. @@ -3000,25 +3006,25 @@ p, li { white-space: pre-wrap; } SubscribeEditor - - - + + + Renaming a subscription - + The subscription name is invalid, please try another. - + New name of this subscription has been used already, please suggest another one - + Failed to rename a subscription, this is an unknown error.