Merge branch 'dev' into dev-plugin-system

* dev: (23 commits)
  fix: somewhat more fixes
  fix: stop eating memory and added header guards
  fix: fixed HiDPI blurred QrImage, added new command arg noScaleFactor
  fix: fixing MainWindow size issue.
  fix: fixed a SIGFAULT when exit is triggered by the SIGNALS
  debian: Bump version
  version: bump version
  URGENT: fixed file loading if a source file was not in UTF-8
  bumping versions
  updating translations
  fix: rearrange MainWindow.hpp, fixed #435
  embed some schemes
  update: some minor refactors
  debian: bump version
  naive impl: exporting
  fixing windows up
  adding std::optional for windows
  impl: importing schemes
  refactoring RouteSettngsMatrix
  misc ui tweaks (#434)
  ...
This commit is contained in:
Qv2ray-dev 2020-03-22 18:23:27 +08:00
commit f08d65c618
36 changed files with 1246 additions and 644 deletions

1
.gitignore vendored
View File

@ -5,6 +5,7 @@
.vs/
*.qm
./.vscode
CMakeSettings.json
SourceTrail/

View File

@ -1,11 +1,22 @@
# Qv2ray - Make v2ray real cross-platform
[![archlinuxcn](https://img.shields.io/badge/archlinuxcn-available-success?style=flat-square)](https://build.archlinuxcn.org/packages/#/qv2ray)
[![flathub](https://img.shields.io/badge/flathub-available-success?style=flat-square)](https://flathub.org/apps/details/com.github.Qv2ray)
[![HitCount](http://hits.dwyl.io/Qv2ray/Qv2ray.svg)](http://hits.dwyl.io/Qv2ray/Qv2ray)
![GitHub Releases](https://img.shields.io/github/downloads/Qv2ray/Qv2ray/latest/total?style=flat-square&logo=github)
![GitHub All Releases](https://img.shields.io/github/downloads/Qv2ray/Qv2ray/total?label=downloads-total&logo=github&style=flat-square)
[![GitHub Releases](https://img.shields.io/github/downloads/Qv2ray/Qv2ray/latest/total?style=flat-square&logo=github)](https://github.com/Qv2ray/Qv2ray/releases)
[![GitHub All Releases](https://img.shields.io/github/downloads/Qv2ray/Qv2ray/total?label=downloads-total&logo=github&style=flat-square)](https://github.com/Qv2ray/Qv2ray/releases)
[![flathub](https://img.shields.io/badge/flathub-available-success?style=flat-square)](https://flathub.org/apps/details/com.github.Qv2ray)
[![Snap](https://snapcraft.io/qv2ray/badge.svg)](https://snapcraft.io/qv2ray/)
[![AUR Stable](https://img.shields.io/aur/version/qv2ray?label=aur-stable&style=flat-square)](https://aur.archlinux.org/packages/qv2ray)
[![AUR Development](https://img.shields.io/aur/version/qv2ray-dev-git?label=aur-development&style=flat-square)](https://aur.archlinux.org/packages/qv2ray-dev-git)
[![ArchlinuxCN Stable](https://img.shields.io/badge/dynamic/json?label=archlinuxcn-stable&query=%24.latest.pkgver&url=https%3A%2F%2Fbuild.archlinuxcn.org%2Fapi%2Fpackages%2Fqv2ray)](https://build.archlinuxcn.org/packages/#/qv2ray)
[![ArchlinuxCN Development](https://img.shields.io/badge/dynamic/json?label=archlinuxcn-dev-git&query=%24.latest.pkgver&url=https%3A%2F%2Fbuild.archlinuxcn.org%2Fapi%2Fpackages%2Fqv2ray-dev-git)](https://build.archlinuxcn.org/packages/#/qv2ray-dev-git)
[![Qv2ray AUR Build](https://github.com/Qv2ray/Qv2ray/workflows/Build%20Qv2ray%20AUR/badge.svg)](https://github.com/Qv2ray/Qv2ray/actions?query=workflow%3A%22Build+Qv2ray+AUR%22)
[![Qv2ray Debian Package](https://github.com/Qv2ray/Qv2ray/workflows/Qv2ray%20build%20debian%20package/badge.svg)](https://github.com/Qv2ray/Qv2ray/actions?query=workflow%3A%22Qv2ray+build+debian+package%22)
[![Qv2ray Build Matrix](https://github.com/Qv2ray/Qv2ray/workflows/Qv2ray%20build%20matrix%20-%20cmake/badge.svg)](https://github.com/Qv2ray/Qv2ray/actions?query=workflow%3A%22Qv2ray+build+matrix+-+cmake%22)
Snap Build Status: [![Snap Status](https://travis-ci.com/Qv2ray/Qv2ray.svg?branch=master)](https://travis-ci.com/Qv2ray/Qv2ray)
使用 Qt 框架的跨平台 v2ray 客户端。支持 Windows, Linux, macOS。

14
debian/changelog vendored
View File

@ -1,3 +1,17 @@
qv2ray (2.3.1-1) unstable; urgency=medium
* fixed file loading if a source file was not in UTF-8
-- Guobang Bi <ymshenyu@gmail.com> Sat, 21 Mar 2020 08:50:17 +0800
qv2ray (2.3.0-1) unstable; urgency=medium
* misc ui tweaks
* fully support setting the block,proxy,direct geosite/plain domains
* fixed vmess:// 'h2' import issue
-- Guobang Bi <ymshenyu@gmail.com> Fri, 20 Mar 2020 22:26:20 +0800
qv2ray (2.2.3-1) unstable; urgency=medium
* Initial release

View File

@ -1 +1 @@
4752
5052

View File

@ -1 +1 @@
2.2.3
2.3.1

View File

@ -14,10 +14,8 @@ namespace Qv2ray
bool debugLog;
/// Enable Network toolbar plugin.
bool enableToolbarPlguin;
/// Endable HiDPI support.
bool hiDPI;
/// Force endable HiDPI support.
bool forceHiDPI;
/// Disable Qt scale factors support.
bool noScaleFactors;
};
} // namespace base
inline base::QvStartupOptions StartupOption = base::QvStartupOptions();

View File

@ -8,8 +8,7 @@ namespace Qv2ray::common
: QObject(), noAPIOption("noAPI", tr("Disable gRPC API subsystems.")), //
runAsRootOption("I-just-wanna-run-with-root", tr("Explicitly run Qv2ray as root.")), //
debugOption("debug", tr("Enable Debug Output")), //
hiDpiOption("hiDPI", tr("Enable HiDPI support for Qt")), //
forceHiDpiOption("force-hiDPI", tr("Force enable HiDPI support for Qt")), //
noScaleFactorOption("noScaleFactor", tr("Disable manually set QT_SCALE_FACTOR")), //
withToolbarOption("withToolbarPlugin", tr("Enable Qv2ray network toolbar plugin")), //
//
helpOption("FAKE"), versionOption("FAKE")
@ -20,8 +19,7 @@ namespace Qv2ray::common
parser.addOption(noAPIOption);
parser.addOption(runAsRootOption);
parser.addOption(debugOption);
parser.addOption(hiDpiOption);
parser.addOption(forceHiDpiOption);
parser.addOption(noScaleFactorOption);
parser.addOption(withToolbarOption);
helpOption = parser.addHelpOption();
versionOption = parser.addVersionOption();
@ -59,16 +57,10 @@ namespace Qv2ray::common
StartupOption.debugLog = true;
}
if (parser.isSet(hiDpiOption))
if (parser.isSet(noScaleFactorOption))
{
DEBUG(MODULE_INIT, "hiDPI is set.")
StartupOption.hiDPI = true;
}
if (parser.isSet(forceHiDpiOption))
{
DEBUG(MODULE_INIT, "forceHiDPI is set.")
StartupOption.forceHiDPI = true;
DEBUG(MODULE_INIT, "noScaleFactorOption is set.")
StartupOption.noScaleFactors = true;
}
if (parser.isSet(withToolbarOption))

View File

@ -27,8 +27,7 @@ namespace Qv2ray::common
QCommandLineOption noAPIOption;
QCommandLineOption runAsRootOption;
QCommandLineOption debugOption;
QCommandLineOption hiDpiOption;
QCommandLineOption forceHiDpiOption;
QCommandLineOption noScaleFactorOption;
QCommandLineOption withToolbarOption;
QCommandLineOption helpOption;
QCommandLineOption versionOption;

View File

@ -29,25 +29,25 @@ namespace Qv2ray::common
QString StringFromFile(const QString &filePath)
{
QFile f(filePath);
return StringFromFile(&f);
return StringFromFile(f);
}
QString StringFromFile(QFile *source)
QString StringFromFile(QFile &source)
{
bool wasOpened = source->isOpen();
bool wasOpened = source.isOpen();
if (!wasOpened)
source->open(QFile::ReadOnly);
auto byteArray = source->readAll();
source.open(QFile::ReadOnly);
auto byteArray = source.readAll();
if (!wasOpened)
source->close();
source.close();
//
QTextCodec::ConverterState state;
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
const QString text = codec->toUnicode(byteArray.constData(), byteArray.size(), &state);
if (state.invalidChars > 0)
{
LOG(MODULE_FILEIO, "Not a valid UTF-8 sequence: " + source->fileName())
return source->readAll();
LOG(MODULE_FILEIO, "Not a valid UTF-8 sequence: " + source.fileName())
return byteArray;
}
else
{
@ -74,12 +74,6 @@ namespace Qv2ray::common
return override;
}
QJsonObject JSONFromFile(QFile *sourceFile)
{
QString json = StringFromFile(sourceFile);
return JsonFromString(json);
}
QString JsonToString(const QJsonObject &json, QJsonDocument::JsonFormat format)
{
QJsonDocument doc;
@ -239,10 +233,14 @@ namespace Qv2ray::common
QGraphicsBlurEffect pBlur;
//
view.setScene(&scene);
view.resize(pixmap.size() / QWidget().devicePixelRatio());
view.setSceneRect(pixmap.rect());
scene.setSceneRect(pixmap.rect());
pBlur.setBlurRadius(rad);
QGraphicsPixmapItem *p = view.scene()->addPixmap(pixmap);
p->setGraphicsEffect(&pBlur);
view.setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
return view.grab();
}
@ -255,9 +253,13 @@ namespace Qv2ray::common
pColor.setStrength(factor);
//
view.setScene(&scene);
view.resize(pixmap.size() / QWidget().devicePixelRatio());
view.setSceneRect(pixmap.rect());
scene.setSceneRect(pixmap.rect());
QGraphicsPixmapItem *p = view.scene()->addPixmap(pixmap);
p->setGraphicsEffect(&pColor);
view.setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
return view.grab();
}
} // namespace Qv2ray::common

View File

@ -26,7 +26,7 @@ namespace Qv2ray::common
QMessageBox::StandardButton extraButtons = QMessageBox::NoButton);
//
QString StringFromFile(const QString &filePath);
QString StringFromFile(QFile *source);
QString StringFromFile(QFile &source);
bool StringToFile(const QString &text, QFile &target);
bool StringToFile(const QString &text, const QString &targetpath);
//
@ -50,7 +50,7 @@ namespace Qv2ray::common
}
//
template<typename TYPE>
QString StructToJsonString(const TYPE t)
QString StructToJsonString(const TYPE &t)
{
return QString::fromStdString(x2struct::X::tojson(t, "", 4, ' '));
}
@ -100,12 +100,9 @@ namespace Qv2ray::common
inline QString timeToString(const time_t &t)
{
auto _tm = std::localtime(&t);
char MY_TIME[128];
setlocale(1, "3");
// using strftime to display time
strftime(MY_TIME, sizeof(MY_TIME), "%x - %I:%M%p", _tm);
return QString(MY_TIME);
QDateTime timestamp;
timestamp.setSecsSinceEpoch(t);
return timestamp.toString(Qt::SystemLocaleShortDate);
}
inline void FastAppendTextDocument(const QString &message, QTextDocument *doc)

View File

@ -6,7 +6,7 @@ namespace Qv2ray::core::connection
{
namespace ConnectionIO
{
CONFIGROOT ConvertConfigFromFile(QString sourceFilePath, bool importComplex)
CONFIGROOT ConvertConfigFromFile(const QString &sourceFilePath, bool importComplex)
{
QFile source(sourceFilePath);
@ -15,7 +15,7 @@ namespace Qv2ray::core::connection
LOG(MODULE_FILEIO, "Trying to import from an non-existing file.") return CONFIGROOT();
}
auto root = CONFIGROOT(JsonFromString(StringFromFile(&source)));
auto root = CONFIGROOT(JsonFromString(StringFromFile(source)));
if (!importComplex)
{

View File

@ -1,12 +1,12 @@
#pragma once
#include "base/Qv2rayBase.hpp"
#include "core/CoreSafeTypes.hpp"
namespace Qv2ray::core::connection
{
namespace ConnectionIO
{
// File Protocol
CONFIGROOT ConvertConfigFromFile(QString sourceFilePath, bool importComplex);
CONFIGROOT ConvertConfigFromFile(const QString &sourceFilePath, bool importComplex);
} // namespace ConnectionIO
} // namespace Qv2ray::core::connection

View File

@ -1,3 +1,4 @@
#pragma once
#include "base/Qv2rayBase.hpp"
namespace Qv2ray::core::connection

View File

@ -1,3 +1,4 @@
#pragma once
#include "base/Qv2rayBase.hpp"
#include "core/CoreSafeTypes.hpp"

View File

@ -86,7 +86,7 @@ namespace Qv2ray::core::config
//
// Verify JSON file format. (only) because this file version may
// not be upgraded and may contain unsupported structure.
auto err = VerifyJsonString(StringFromFile(&configFile));
auto err = VerifyJsonString(StringFromFile(configFile));
if (!err.isEmpty())
{
@ -96,7 +96,7 @@ namespace Qv2ray::core::config
else
{
// If the file format is valid.
auto conf = JsonFromString(StringFromFile(&configFile));
auto conf = JsonFromString(StringFromFile(configFile));
LOG(MODULE_SETTINGS,
"Path: " + path + " contains a config file, in version " + conf["config_version"].toVariant().toString())
configFile.close();

View File

@ -1,3 +1,4 @@
#pragma once
#include "base/Qv2rayBase.hpp"
namespace Qv2ray::core::config

View File

@ -26,6 +26,7 @@
void signalHandler(int signum)
{
cout << "Qv2ray: Interrupt signal (" << signum << ") received." << endl;
ExitQv2ray();
qApp->exit(-99);
}
@ -227,17 +228,16 @@ int main(int argc, char *argv[])
SingleApplication::setApplicationName("qv2ray_debug");
SingleApplication::setApplicationDisplayName("Qv2ray - " + QObject::tr("Debug version"));
#endif
if ((!qEnvironmentVariableIsSet("QT_DEVICE_PIXEL_RATIO") && //
!qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") && //
!qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && //
!qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) || //
StartupOption.forceHiDPI)
if (StartupOption.noScaleFactors)
{
if (StartupOption.forceHiDPI || StartupOption.hiDPI)
{
DEBUG(MODULE_INIT, "High DPI scaling is enabled.")
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}
LOG(MODULE_INIT, "Force set QT_SCALE_FACTOR to 0.")
LOG(MODULE_UI, "Original QT_SCALE_FACTOR was: " + qEnvironmentVariable("QT_SCALE_FACTOR"))
qputenv("QT_SCALE_FACTOR", "1");
}
else
{
LOG(MODULE_INIT, "High DPI scaling is enabled.")
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}
SingleApplication _qApp(argc, argv, false,
SingleApplication::User | SingleApplication::ExcludeAppPath | SingleApplication::ExcludeAppVersion);
@ -251,42 +251,36 @@ int main(int argc, char *argv[])
bool _result_ = Qv2rayTranslator->InstallTranslation(_lang);
LOG(MODULE_UI, "Installing a tranlator from OS: " + _lang + " -- " + (_result_ ? "OK" : "Failed"))
//
LOG("LICENCE", NEWLINE
"This program comes with ABSOLUTELY NO WARRANTY." NEWLINE "This is free software, and you are welcome to redistribute it" NEWLINE
"under certain conditions." NEWLINE NEWLINE "Copyright (c) 2019-2020 Qv2ray Development Group." NEWLINE NEWLINE NEWLINE
"Libraries that have been used in Qv2ray are listed below (Sorted by date added):" NEWLINE
"Copyright (c) 2020 dridk (@dridk): X2Struct (Apache)" NEWLINE "Copyright (c) 2011 SCHUTZ Sacha (@dridk): QJsonModel (MIT)" NEWLINE
"Copyright (c) 2020 Nikolaos Ftylitakis (@ftylitak): QZXing (Apache2)" NEWLINE
"Copyright (c) 2016 Singein (@Singein): ScreenShot (MIT)" NEWLINE
"Copyright (c) 2016 Nikhil Marathe (@nikhilm): QHttpServer (MIT)" NEWLINE
"Copyright (c) 2020 Itay Grudev (@itay-grudev): SingleApplication (MIT)" NEWLINE
"Copyright (c) 2020 paceholder (@paceholder): nodeeditor (QNodeEditor modified by lhy0403) (BSD-3-Clause)" NEWLINE
"Copyright (c) 2019 TheWanderingCoel (@TheWanderingCoel): ShadowClash (launchatlogin) (GPLv3)" NEWLINE
"Copyright (c) 2020 Ram Pani (@DuckSoft): QvRPCBridge (WTFPL)" NEWLINE
"Copyright (c) 2019 ShadowSocks (@shadowsocks): libQtShadowsocks (LGPLv3)" NEWLINE
"Copyright (c) 2015-2020 qBittorrent (Anton Lashkov) (@qBittorrent): speedplotview (GPLv2)" NEWLINE NEWLINE)
LOG("LICENCE", NEWLINE //
"This program comes with ABSOLUTELY NO WARRANTY." NEWLINE //
"This is free software, and you are welcome to redistribute it" NEWLINE //
"under certain conditions." NEWLINE //
NEWLINE //
"Copyright (c) 2019-2020 Qv2ray Development Group." NEWLINE //
NEWLINE //
"Libraries that have been used in Qv2ray are listed below (Sorted by date added):" NEWLINE //
"Copyright (c) 2020 dridk (@dridk): X2Struct (Apache)" NEWLINE //
"Copyright (c) 2011 SCHUTZ Sacha (@dridk): QJsonModel (MIT)" NEWLINE //
"Copyright (c) 2020 Nikolaos Ftylitakis (@ftylitak): QZXing (Apache2)" NEWLINE //
"Copyright (c) 2016 Singein (@Singein): ScreenShot (MIT)" NEWLINE //
"Copyright (c) 2016 Nikhil Marathe (@nikhilm): QHttpServer (MIT)" NEWLINE //
"Copyright (c) 2020 Itay Grudev (@itay-grudev): SingleApplication (MIT)" NEWLINE //
"Copyright (c) 2020 paceholder (@paceholder): nodeeditor (QNodeEditor modified by lhy0403) (BSD-3-Clause)" NEWLINE //
"Copyright (c) 2019 TheWanderingCoel (@TheWanderingCoel): ShadowClash (launchatlogin) (GPLv3)" NEWLINE //
"Copyright (c) 2020 Ram Pani (@DuckSoft): QvRPCBridge (WTFPL)" NEWLINE //
"Copyright (c) 2019 ShadowSocks (@shadowsocks): libQtShadowsocks (LGPLv3)" NEWLINE //
"Copyright (c) 2015-2020 qBittorrent (Anton Lashkov) (@qBittorrent): speedplotview (GPLv2)" NEWLINE NEWLINE) //
//
LOG(MODULE_INIT, "Qv2ray Start Time: " + QSTRN(QTime::currentTime().msecsSinceStartOfDay()))
//
#ifdef QT_DEBUG
cout << "WARNING: ============================== This is a debug build, many features are not stable enough. =============================="
<< endl;
cout << "WARNING: ========================= This is a debug build, many features are not stable enough. =========================" << endl;
#endif
//
// Load the language translation list.
// auto translationDir = Qv
// auto translationDir = QvTranslator::deduceTranslationDir();
// if (!translationDir)
// {
// LOG(MODULE_INIT, "FAILED to find any translations. THIS IS A BUILD ERROR.")
// QvMessageBoxWarn(nullptr, QObject::tr("Cannot load languages"),
// QObject::tr("Qv2ray will continue running, but you cannot change the UI language."));
// }
// Qv2ray Initialize, find possible config paths and verify them.
if (!initialiseQv2ray())
{
LOG(MODULE_INIT, "Failed to initialise Qv2ray, exiting.")
return -1;
}
@ -324,7 +318,7 @@ int main(int argc, char *argv[])
if (Qv2rayTranslator->InstallTranslation(confObject.uiConfig.language))
{
LOG(MODULE_INIT, "Successfully installed a translator for " + confObject.uiConfig.language);
LOG(MODULE_INIT, "Successfully installed a translator for " + confObject.uiConfig.language)
}
else
{

View File

@ -254,7 +254,7 @@ void ImportConfigWindow::on_cancelImportBtn_clicked()
void ImportConfigWindow::on_subscriptionButton_clicked()
{
hide();
SubscribeEditor w;
SubscriptionEditor w;
w.exec();
auto importToComplex = !keepImportedInboundCheckBox->isEnabled();
connections.clear();

View File

@ -211,21 +211,35 @@
<string>Subscriptions / Manually Input</string>
</attribute>
<layout class="QFormLayout" name="formLayout_4">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_16">
<item row="1" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Manually Input Connections</string>
<string>Subscription Link</string>
</property>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Subscription Manager</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="subscriptionButton">
<property name="text">
<string>Open Subscription Manager</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Connection Editor</string>
</property>
</widget>
</item>
<item row="1" column="1">
<item row="5" column="1">
<widget class="QPushButton" name="connectionEditBtn">
<property name="text">
<string>Open Connection Editor</string>
@ -235,14 +249,14 @@
</property>
</widget>
</item>
<item row="2" column="0">
<item row="6" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Route Editor</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="6" column="1">
<widget class="QPushButton" name="routeEditBtn">
<property name="text">
<string>Open Route Editor</string>
@ -252,8 +266,38 @@
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<item row="7" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Json Editor</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QPushButton" name="jsonEditBtn">
<property name="text">
<string>Open JSON Editor</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Manually Input Connections</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="Line" name="line">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
@ -265,44 +309,6 @@
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Subscription Link</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Subscription Manager</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QPushButton" name="subscriptionButton">
<property name="text">
<string>Open Subscription Manager</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Json Editor</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="jsonEditBtn">
<property name="text">
<string>Open JSON Editor</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage1">
@ -392,7 +398,6 @@
<tabstop>errorsList</tabstop>
<tabstop>connectionEditBtn</tabstop>
<tabstop>routeEditBtn</tabstop>
<tabstop>subscriptionButton</tabstop>
<tabstop>beginImportBtn</tabstop>
<tabstop>cancelImportBtn</tabstop>
</tabstops>

View File

@ -312,7 +312,7 @@ void MainWindow::timerEvent(QTimerEvent *event)
auto log = readLastLog().trimmed();
if (!log.isEmpty())
{
FastAppendTextDocument(NEWLINE + log, qvLogDocument);
FastAppendTextDocument(NEWLINE + log, qvLogDocument); /*end*/
// qvLogDocument->setPlainText(qvLogDocument->toPlainText() + NEWLINE + log);
}
}
@ -379,11 +379,15 @@ void MainWindow::VersionUpdate(QByteArray &data)
{
LOG(MODULE_UPDATE, "New version detected.")
auto link = root["html_url"].toString("");
auto result =
QvMessageBoxAsk(this, tr("Update"),
tr("Found a new version: ") + root["tag_name"].toString("") + "\r\n" + root["name"].toString("") +
"\r\n------------\r\n" + root["body"].toString("") + "\r\n------------\r\n" + tr("Download Link: ") + link,
QMessageBox::Ignore);
auto result = QvMessageBoxAsk(this, tr("Update"),
tr("Found a new version: ") + //
root["tag_name"].toString("") + NEWLINE + //
root["name"].toString("") + //
NEWLINE "------------" NEWLINE + //
root["body"].toString("") + //
NEWLINE "------------" NEWLINE + //
tr("Download Link: ") + link,
QMessageBox::Ignore);
if (result == QMessageBox::Yes)
{
@ -393,7 +397,7 @@ void MainWindow::VersionUpdate(QByteArray &data)
{
// Set and save ingored version.
GlobalConfig.ignoredVersion = newVersion.toString();
// SaveGlobalConfig(GlobalConfig);
SaveGlobalSettings();
}
}
}
@ -567,7 +571,7 @@ void MainWindow::on_action_RCM_EditAsComplex_triggered()
void MainWindow::on_subsButton_clicked()
{
SubscribeEditor().exec();
SubscriptionEditor().exec();
}
void MainWindow::on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)

View File

@ -34,6 +34,7 @@ class MainWindow
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow() override;
static MainWindow *mwInstance;
signals:
void StartConnection() const;
void StopConnection() const;
@ -42,47 +43,29 @@ class MainWindow
private:
QvMessageBusSlotDecl;
private slots:
#ifndef DISABLE_AUTO_UPDATE
void VersionUpdate(QByteArray &data);
#endif
void on_activatedTray(QSystemTrayIcon::ActivationReason reason);
void on_actionExit_triggered();
void on_preferencesBtn_clicked();
void on_clearlogButton_clicked();
void on_connectionListWidget_customContextMenuRequested(const QPoint &pos);
void on_importConfigButton_clicked();
void on_subsButton_clicked();
//
void ToggleVisibility();
#ifndef DISABLE_AUTO_UPDATE
void VersionUpdate(QByteArray &data);
#endif
void on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
void on_connectionFilterTxt_textEdited(const QString &arg1);
void on_connectionListWidget_itemClicked(QTreeWidgetItem *item, int column);
void on_locateBtn_clicked();
//
void on_chartVisibilityBtn_clicked();
void on_logVisibilityBtn_clicked();
void on_clearChartBtn_clicked();
void on_connectionListWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void on_masterLogBrowser_textChanged();
public:
static MainWindow *mwInstance;
protected:
void keyPressEvent(QKeyEvent *e) override;
void keyReleaseEvent(QKeyEvent *e) override;
void closeEvent(QCloseEvent *) override;
private slots:
void OnEditRequested(const ConnectionId &id);
void OnEditJsonRequested(const ConnectionId &id);
//
void OnConnectionWidgetFocusRequested(const ConnectionItemWidget *widget);
//
void OnConnected(const ConnectionId &id);
void OnDisconnected(const ConnectionId &id);
//
void OnStatsAvailable(const ConnectionId &id, const quint64 upS, const quint64 downS, const quint64 upD, const quint64 downD);
void OnVCoreLogAvailable(const ConnectionId &id, const QString &log);
//
void OnConnectionCreated(const ConnectionId &id, const QString &displayName);
void OnConnectionDeleted(const ConnectionId &id, const GroupId &groupId);
void OnConnectionGroupChanged(const ConnectionId &id, const GroupId &originalGroup, const GroupId &newGroup);
//
void OnGroupCreated(const GroupId &id, const QString &displayName);
void OnGroupDeleted(const GroupId &id, const QList<ConnectionId> &connections);
//
private:
void on_actionExit_triggered();
void on_action_StartThis_triggered();
void on_action_RCM_SetAutoConnection_triggered();
void on_action_RCM_EditThis_triggered();
@ -96,23 +79,33 @@ class MainWindow
void on_action_RCM_tovCoreLog_triggered();
void on_action_RCM_toQvLog_triggered();
//
void on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
void on_connectionFilterTxt_textEdited(const QString &arg1);
void on_connectionListWidget_itemClicked(QTreeWidgetItem *item, int column);
void on_locateBtn_clicked();
void OnConnectionWidgetFocusRequested(const ConnectionItemWidget *widget);
//
void ToggleVisibility();
void OnEditRequested(const ConnectionId &id);
void OnEditJsonRequested(const ConnectionId &id);
void OnConnected(const ConnectionId &id);
void OnDisconnected(const ConnectionId &id);
//
void OnStatsAvailable(const ConnectionId &id, const quint64 upS, const quint64 downS, const quint64 upD, const quint64 downD);
void OnVCoreLogAvailable(const ConnectionId &id, const QString &log);
//
void OnConnectionCreated(const ConnectionId &id, const QString &displayName);
void OnConnectionDeleted(const ConnectionId &id, const GroupId &groupId);
void OnConnectionGroupChanged(const ConnectionId &id, const GroupId &originalGroup, const GroupId &newGroup);
//
void OnGroupCreated(const GroupId &id, const QString &displayName);
void OnGroupDeleted(const GroupId &id, const QList<ConnectionId> &connections);
//
void SortConnectionList(MW_ITEM_COL byCol, bool asending);
void on_chartVisibilityBtn_clicked();
void on_logVisibilityBtn_clicked();
void on_clearChartBtn_clicked();
void on_connectionListWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void on_masterLogBrowser_textChanged();
void on_pluginsBtn_clicked();
protected:
void timerEvent(QTimerEvent *event) override;
void keyPressEvent(QKeyEvent *e) override;
void keyReleaseEvent(QKeyEvent *e) override;
void closeEvent(QCloseEvent *) override;
private:
QHash<GroupId, shared_ptr<QTreeWidgetItem>> groupNodes;

View File

@ -6,22 +6,19 @@
<rect>
<x>0</x>
<y>0</y>
<width>880</width>
<height>660</height>
<width>860</width>
<height>650</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>780</width>
<height>530</height>
<width>790</width>
<height>600</height>
</size>
</property>
<property name="windowTitle">
<string>Qv2ray</string>
</property>
<property name="toolTip">
<string/>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1,0">
<item>
@ -50,6 +47,19 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
@ -60,7 +70,7 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>999999999</width>
<width>0</width>
<height>0</height>
</size>
</property>

View File

@ -211,8 +211,8 @@ PreferencesWindow::PreferencesWindow(QWidget *parent) : QDialog(parent), Current
QSTRN(pacPortSB->value()) + "/pac");
//
finishedLoading = true;
routeSettingsWidget = new RouteSettingsMatrixWidget(this);
routeSettingsWidget->SetRouteConfig(CurrentConfig.connectionConfig.routeConfig, CurrentConfig.kernelConfig.AssetsPath());
routeSettingsWidget = new RouteSettingsMatrixWidget(CurrentConfig.kernelConfig.AssetsPath(), this);
routeSettingsWidget->SetRouteConfig(CurrentConfig.connectionConfig.routeConfig);
advRouteSettingsLayout->addWidget(routeSettingsWidget);
}
@ -806,7 +806,7 @@ void PreferencesWindow::on_nsBarFontSizeSB_valueChanged(double arg1)
SET_LINE_LIST_TEXT
}
QString PreferencesWindow::GetBarLineDescription(QvBarLine barLine)
QString PreferencesWindow::GetBarLineDescription(const QvBarLine &barLine)
{
QString result = "Empty";
result = NetSpeedPluginMessages[barLine.ContentType];

View File

@ -172,7 +172,7 @@ class PreferencesWindow
void SetAutoStartButtonsState(bool isAutoStart);
// Set ui parameters for a line;
void ShowLineParameters(QvBarLine &line);
QString GetBarLineDescription(QvBarLine line);
QString GetBarLineDescription(const QvBarLine &barLine);
//
int CurrentBarLineId;
int CurrentBarPageId;

View File

@ -4,10 +4,10 @@
#include "core/handler/ConfigHandler.hpp"
#include "core/settings/SettingsBackend.hpp"
SubscribeEditor::SubscribeEditor(QWidget *parent) : QDialog(parent)
SubscriptionEditor::SubscriptionEditor(QWidget *parent) : QDialog(parent)
{
setupUi(this);
QvMessageBusConnect(SubscribeEditor);
QvMessageBusConnect(SubscriptionEditor);
UpdateColorScheme();
for (auto subs : ConnectionManager->Subscriptions())
{
@ -19,13 +19,13 @@ SubscribeEditor::SubscribeEditor(QWidget *parent) : QDialog(parent)
}
}
void SubscribeEditor::UpdateColorScheme()
void SubscriptionEditor::UpdateColorScheme()
{
addSubsButton->setIcon(QICON_R("add.png"));
removeSubsButton->setIcon(QICON_R("delete.png"));
}
QvMessageBusSlotImpl(SubscribeEditor)
QvMessageBusSlotImpl(SubscriptionEditor)
{
switch (msg)
{
@ -33,16 +33,16 @@ QvMessageBusSlotImpl(SubscribeEditor)
}
}
tuple<QString, CONFIGROOT> SubscribeEditor::GetSelectedConfig()
tuple<QString, CONFIGROOT> SubscriptionEditor::GetSelectedConfig()
{
return { GetDisplayName(currentConnectionId), ConnectionManager->GetConnectionRoot(currentConnectionId) };
}
SubscribeEditor::~SubscribeEditor()
SubscriptionEditor::~SubscriptionEditor()
{
}
void SubscribeEditor::on_addSubsButton_clicked()
void SubscriptionEditor::on_addSubsButton_clicked()
{
auto const key = QSTRN(QTime::currentTime().msecsSinceStartOfDay());
auto id = ConnectionManager->CreateGroup(key, true);
@ -50,7 +50,7 @@ void SubscribeEditor::on_addSubsButton_clicked()
subscriptionList->addTopLevelItem(new QTreeWidgetItem(QStringList{ key, id.toString() }));
}
void SubscribeEditor::on_updateButton_clicked()
void SubscriptionEditor::on_updateButton_clicked()
{
if (QvMessageBoxAsk(this, tr("Reload Subscription"), tr("Would you like to reload the subscription?")) == QMessageBox::Yes)
{
@ -61,7 +61,7 @@ void SubscribeEditor::on_updateButton_clicked()
}
}
void SubscribeEditor::on_removeSubsButton_clicked()
void SubscriptionEditor::on_removeSubsButton_clicked()
{
if (QvMessageBoxAsk(this, tr("Deleting a subscription"), tr("All connections will be moved to default group, do you want to continue?")) ==
QMessageBox::Yes)
@ -82,17 +82,17 @@ void SubscribeEditor::on_removeSubsButton_clicked()
}
}
void SubscribeEditor::on_buttonBox_accepted()
void SubscriptionEditor::on_buttonBox_accepted()
{
// Nothing?
}
void SubscribeEditor::on_subscriptionList_itemSelectionChanged()
void SubscriptionEditor::on_subscriptionList_itemSelectionChanged()
{
groupBox_2->setEnabled(subscriptionList->selectedItems().count() > 0);
}
void SubscribeEditor::on_subscriptionList_itemClicked(QTreeWidgetItem *item, int column)
void SubscriptionEditor::on_subscriptionList_itemClicked(QTreeWidgetItem *item, int column)
{
Q_UNUSED(column)
@ -119,31 +119,31 @@ void SubscribeEditor::on_subscriptionList_itemClicked(QTreeWidgetItem *item, int
}
}
void SubscribeEditor::on_subscriptionList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
void SubscriptionEditor::on_subscriptionList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
Q_UNUSED(previous)
on_subscriptionList_itemClicked(current, 0);
}
void SubscribeEditor::on_subNameTxt_textEdited(const QString &arg1)
void SubscriptionEditor::on_subNameTxt_textEdited(const QString &arg1)
{
subscriptionList->selectedItems().first()->setText(0, arg1);
ConnectionManager->RenameGroup(currentSubId, arg1.trimmed());
}
void SubscribeEditor::on_subAddrTxt_textEdited(const QString &arg1)
void SubscriptionEditor::on_subAddrTxt_textEdited(const QString &arg1)
{
auto newUpdateInterval = updateIntervalSB->value();
ConnectionManager->SetSubscriptionData(currentSubId, arg1, newUpdateInterval);
}
void SubscribeEditor::on_updateIntervalSB_valueChanged(double arg1)
void SubscriptionEditor::on_updateIntervalSB_valueChanged(double arg1)
{
auto newAddress = subAddrTxt->text().trimmed();
ConnectionManager->SetSubscriptionData(currentSubId, newAddress, arg1);
}
void SubscribeEditor::on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
void SubscriptionEditor::on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
Q_UNUSED(previous)
if (current != nullptr)

View File

@ -7,15 +7,15 @@
#include <QDialog>
class SubscribeEditor
class SubscriptionEditor
: public QDialog
, private Ui::w_SubscribeEditor
{
Q_OBJECT
public:
explicit SubscribeEditor(QWidget *parent = nullptr);
~SubscribeEditor();
explicit SubscriptionEditor(QWidget *parent = nullptr);
~SubscriptionEditor();
tuple<QString, CONFIGROOT> GetSelectedConfig();
private:

View File

@ -84,7 +84,7 @@ void ConnectionInfoWidget::ShowDetails(const tuple<GroupId, ConnectionId> &_iden
//
QZXingEncoderConfig conf;
conf.border = true;
conf.imageSize = QSize(400, 400);
conf.imageSize = qrLabel->size() * devicePixelRatio();
conf.errorCorrectionLevel = QZXing::EncodeErrorCorrectionLevel_M;
QZXing qzx;
qrPixmap = QPixmap::fromImage(qzx.encodeData(shareLink, conf));

View File

@ -62,56 +62,23 @@
namespace Qv2ray::ui::widgets
{
AutoCompleteTextEdit::AutoCompleteTextEdit(const QString &prefix, QWidget *parent) : QTextEdit(parent)
{
SetPrefix(prefix);
}
AutoCompleteTextEdit::~AutoCompleteTextEdit()
{
}
void AutoCompleteTextEdit::SetPrefix(const QString &prefix)
AutoCompleteTextEdit::AutoCompleteTextEdit(const QString &prefix, const QStringList &sourceStrings, QWidget *parent) : QTextEdit(parent)
{
this->prefix = prefix;
}
void AutoCompleteTextEdit::SetSourceStrings(QStringList sourceStrings)
{
auto x = new QCompleter(this);
auto model = new QStringListModel(sourceStrings);
x->setModel(model);
SetCompleter(x);
}
void AutoCompleteTextEdit::SetCompleter(QCompleter *completer)
{
if (c)
c->disconnect(this);
c = completer;
if (!c)
{
return;
}
c = new QCompleter(this);
c->setModel(new QStringListModel(sourceStrings, c));
c->setWidget(this);
c->setCompletionMode(QCompleter::PopupCompletion);
c->setCaseSensitivity(Qt::CaseInsensitive);
QObject::connect(c, QOverload<const QString &>::of(&QCompleter::activated), this, &AutoCompleteTextEdit::insertCompletion);
}
QCompleter *AutoCompleteTextEdit::completer() const
AutoCompleteTextEdit::~AutoCompleteTextEdit()
{
return c;
}
void AutoCompleteTextEdit::insertCompletion(const QString &completion)
{
if (c->widget() != this)
return;
QTextCursor tc = textCursor();
int extra = completion.length() - c->completionPrefix().length();
tc.movePosition(QTextCursor::Left);

View File

@ -62,14 +62,9 @@ namespace Qv2ray::ui::widgets
Q_OBJECT
public:
AutoCompleteTextEdit(const QString &prefix, QWidget *parent = nullptr);
AutoCompleteTextEdit(const QString &prefix, const QStringList &sourceStrings, QWidget *parent = nullptr);
~AutoCompleteTextEdit();
void SetPrefix(const QString &prefix);
void SetCompleter(QCompleter *c);
void SetSourceStrings(QStringList sourceStrings);
QCompleter *completer() const;
protected:
void keyPressEvent(QKeyEvent *e) override;
void focusInEvent(QFocusEvent *e) override;
@ -81,9 +76,7 @@ namespace Qv2ray::ui::widgets
QString lineUnderCursor() const;
QString wordUnderCursor() const;
private:
QString prefix;
QAbstractItemModel *modelFromStringList(const QStringList &list);
QCompleter *c = nullptr;
};
} // namespace Qv2ray::ui::widgets

View File

@ -3,38 +3,27 @@
#include "common/QvHelpers.hpp"
#include "components/geosite/QvGeositeReader.hpp"
RouteSettingsMatrixWidget::RouteSettingsMatrixWidget(QWidget *parent) : QWidget(parent)
#include <QFileDialog>
#include <QInputDialog>
RouteSettingsMatrixWidget::RouteSettingsMatrixWidget(const QString &assetsDirPath, QWidget *parent)
: QWidget(parent), assetsDirPath(assetsDirPath)
{
setupUi(this);
//
directDomainTxt = new AutoCompleteTextEdit("geosite", this);
proxyDomainTxt = new AutoCompleteTextEdit("geosite", this);
blockDomainTxt = new AutoCompleteTextEdit("geosite", this);
//
directIPTxt = new AutoCompleteTextEdit("geoip", this);
proxyIPTxt = new AutoCompleteTextEdit("geoip", this);
blockIPTxt = new AutoCompleteTextEdit("geoip", this);
}
void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig conf, const QString &assetsDirPath)
{
directDomainTxt->setText(conf.domains.direct.join(NEWLINE));
proxyDomainTxt->setText(conf.domains.proxy.join(NEWLINE));
blockDomainTxt->setText(conf.domains.block.join(NEWLINE));
//
blockIPTxt->setText(conf.ips.block.join(NEWLINE));
directIPTxt->setText(conf.ips.direct.join(NEWLINE));
proxyIPTxt->setText(conf.ips.proxy.join(NEWLINE));
builtInSchemesMenu = new QMenu(this);
builtInSchemesMenu->addActions(this->getBuiltInSchemes());
builtInSchemeBtn->setMenu(builtInSchemesMenu);
//
auto sourceStringsDomain = ReadGeoSiteFromFile(assetsDirPath + "/geosite.dat");
directDomainTxt->SetSourceStrings(sourceStringsDomain);
proxyDomainTxt->SetSourceStrings(sourceStringsDomain);
blockDomainTxt->SetSourceStrings(sourceStringsDomain);
directDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
proxyDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
blockDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
//
auto sourceStringsIP = ReadGeoSiteFromFile(assetsDirPath + "/geoip.dat");
directIPTxt->SetSourceStrings(sourceStringsIP);
proxyIPTxt->SetSourceStrings(sourceStringsIP);
blockIPTxt->SetSourceStrings(sourceStringsIP);
directIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
proxyIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
blockIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
//
directTxtLayout->addWidget(directDomainTxt, 0, 0);
proxyTxtLayout->addWidget(proxyDomainTxt, 0, 0);
@ -43,6 +32,195 @@ void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig c
directIPLayout->addWidget(directIPTxt, 0, 0);
proxyIPLayout->addWidget(proxyIPTxt, 0, 0);
blockIPLayout->addWidget(blockIPTxt, 0, 0);
//
}
/**
* @brief RouteSettingsMatrixWidget::getBuiltInSchemes
* @return
*/
QList<QAction *> RouteSettingsMatrixWidget::getBuiltInSchemes()
{
QList<QAction *> list;
Qv2ray::base::config::Qv2rayRouteConfig emptyScheme;
list.append(this->schemeToAction(tr("empty scheme"), emptyScheme));
// v2rayN scheme from 2dust/v2rayCustomRoutingList
// License: GPL3
Qv2ray::base::config::Qv2rayRouteConfig v2rayNScheme;
v2rayNScheme.ips.proxy = {
"91.108.4.0/22", "91.108.8.0/22", "91.108.12.0/22", "91.108.20.0/22", "91.108.36.0/23",
"91.108.38.0/23", "91.108.56.0/22", "149.154.160.0/20", "149.154.164.0/22", "149.154.172.0/22",
"74.125.0.0/16", "173.194.0.0/16", "172.217.0.0/16", "216.58.200.0/24", "216.58.220.0/24",
"91.108.56.116", "91.108.56.0/24", "109.239.140.0/24", "149.154.167.0/24", "149.154.175.0/24",
};
v2rayNScheme.domains.direct = {
"domain:12306.com",
"domain:51ym.me",
"domain:52pojie.cn",
"domain:8686c.com",
"domain:abercrombie.com",
"domain:adobesc.com",
"domain:air-matters.com",
"domain:air-matters.io",
"domain:airtable.com",
"domain:akadns.net",
"domain:apache.org",
"domain:api.crisp.chat",
"domain:api.termius.com",
"domain:appshike.com",
"domain:appstore.com",
"domain:aweme.snssdk.com",
"domain:bababian.com",
"domain:battle.net",
"domain:beatsbydre.com",
"domain:bet365.com",
"domain:bilibili.cn",
"domain:ccgslb.com",
"domain:ccgslb.net",
"domain:chunbo.com",
"domain:chunboimg.com",
"domain:clashroyaleapp.com",
"domain:cloudsigma.com",
"domain:cloudxns.net",
"domain:cmfu.com",
"domain:culturedcode.com",
"domain:dct-cloud.com",
"domain:didialift.com",
"domain:douyutv.com",
"domain:duokan.com",
"domain:dytt8.net",
"domain:easou.com",
"domain:ecitic.net",
"domain:eclipse.org",
"domain:eudic.net",
"domain:ewqcxz.com",
"domain:fir.im",
"domain:frdic.com",
"domain:fresh-ideas.cc",
"domain:godic.net",
"domain:goodread.com",
"domain:haibian.com",
"domain:hdslb.net",
"domain:hollisterco.com",
"domain:hongxiu.com",
"domain:hxcdn.net",
"domain:images.unsplash.com",
"domain:img4me.com",
"domain:ipify.org",
"domain:ixdzs.com",
"domain:jd.hk",
"domain:jianshuapi.com",
"domain:jomodns.com",
"domain:jsboxbbs.com",
"domain:knewone.com",
"domain:kuaidi100.com",
"domain:lemicp.com",
"domain:letvcloud.com",
"domain:lizhi.io",
"domain:localizecdn.com",
"domain:lucifr.com",
"domain:luoo.net",
"domain:mai.tn",
"domain:maven.org",
"domain:miwifi.com",
"domain:moji.com",
"domain:moke.com",
"domain:mtalk.google.com",
"domain:mxhichina.com",
"domain:myqcloud.com",
"domain:myunlu.com",
"domain:netease.com",
"domain:nfoservers.com",
"domain:nssurge.com",
"domain:nuomi.com",
"domain:ourdvs.com",
"domain:overcast.fm",
"domain:paypal.com",
"domain:paypalobjects.com",
"domain:pgyer.com",
"domain:qdaily.com",
"domain:qdmm.com",
"domain:qin.io",
"domain:qingmang.me",
"domain:qingmang.mobi",
"domain:qqurl.com",
"domain:rarbg.to",
"domain:rrmj.tv",
"domain:ruguoapp.com",
"domain:sm.ms",
"domain:snwx.com",
"domain:soku.com",
"domain:startssl.com",
"domain:store.steampowered.com",
"domain:symcd.com",
"domain:teamviewer.com",
"domain:tmzvps.com",
"domain:trello.com",
"domain:trellocdn.com",
"domain:ttmeiju.com",
"domain:udache.com",
"domain:uxengine.net",
"domain:weather.bjango.com",
"domain:weather.com",
"domain:webqxs.com",
"domain:weico.cc",
"domain:wenku8.net",
"domain:werewolf.53site.com",
"domain:windowsupdate.com",
"domain:wkcdn.com",
"domain:workflowy.com",
"domain:xdrig.com",
"domain:xiaojukeji.com",
"domain:xiaomi.net",
"domain:xiaomicp.com",
"domain:ximalaya.com",
"domain:xitek.com",
"domain:xmcdn.com",
"domain:xslb.net",
"domain:xteko.com",
"domain:yach.me",
"domain:yixia.com",
"domain:yunjiasu-cdn.net",
"domain:zealer.com",
"domain:zgslb.net",
"domain:zimuzu.tv",
"domain:zmz002.com",
"domain:samsungdm.com",
};
v2rayNScheme.domains.proxy = {
"geosite:google", "geosite:github", "geosite:netflix", "geosite:steam", "geosite:telegram",
"geosite:tumblr", "geosite:speedtest", "geosite:bbc", "domain:gvt1.com", "domain:textnow.com",
"domain:twitch.tv", "domain:wikileaks.org", "domain:naver.com",
};
v2rayNScheme.domains.block = {
"geosite:category-ads-all",
};
list.append(this->schemeToAction(tr("v2rayN preset"), v2rayNScheme));
return list;
}
QAction *RouteSettingsMatrixWidget::schemeToAction(const QString &name, Qv2ray::base::config::Qv2rayRouteConfig scheme)
{
QAction *action = new QAction();
action->setText(name);
connect(action, &QAction::triggered, [=] { this->SetRouteConfig(scheme); });
return action;
}
void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig &conf)
{
directDomainTxt->setText(conf.domains.direct.join(NEWLINE));
proxyDomainTxt->setText(conf.domains.proxy.join(NEWLINE));
blockDomainTxt->setText(conf.domains.block.join(NEWLINE));
//
blockIPTxt->setText(conf.ips.block.join(NEWLINE));
directIPTxt->setText(conf.ips.direct.join(NEWLINE));
proxyIPTxt->setText(conf.ips.proxy.join(NEWLINE));
}
config::Qv2rayRouteConfig RouteSettingsMatrixWidget::GetRouteConfig() const
@ -61,3 +239,164 @@ config::Qv2rayRouteConfig RouteSettingsMatrixWidget::GetRouteConfig() const
RouteSettingsMatrixWidget::~RouteSettingsMatrixWidget()
{
}
/**
* @brief The Qv2rayRouteScheme struct
* @author DuckSoft <realducksoft@gmail.com>
*/
struct Qv2rayRouteScheme : config::Qv2rayRouteConfig
{
/**
* @brief the name of the scheme.
* @example "Untitled Scheme"
*/
QString name;
/**
* @brief the author of the scheme.
* @example "DuckSoft <realducksoft@gmail.com>"
*/
QString author;
/**
* @brief details of this scheme.
* @example "A scheme to bypass China mainland, while allowing bilibili to go through proxy."
*/
QString description;
// M: all these fields are mandatory
XTOSTRUCT(M(name, author, description, domains, ips));
};
/**
* @brief RouteSettingsMatrixWidget::on_importSchemeBtn_clicked
* @author DuckSoft <realducksoft@gmail.com>
* @todo add some debug output
*/
void RouteSettingsMatrixWidget::on_importSchemeBtn_clicked()
{
try
{
// open up the file dialog and choose a file.
auto filePath = this->openFileDialog();
if (!filePath)
return;
// read the file and parse back to struct.
// if error occurred on parsing, an exception will be thrown.
auto content = StringFromFile(filePath.value());
auto scheme = StructFromJsonString<Qv2rayRouteScheme>(content);
// show the information of this scheme to user,
// and ask user if he/she wants to import and apply this.
auto strPrompt = tr("Import scheme '%1' by '%2'?" NEWLINE "Description: %3").arg(scheme.name, scheme.author, scheme.description);
auto decision = QvMessageBoxAsk(this, tr("Importing Scheme"), strPrompt);
// if user don't want to import, just leave.
if (decision != QMessageBox::Yes)
return;
// write the scheme onto the window
this->SetRouteConfig(static_cast<Qv2rayRouteConfig>(scheme));
// done
LOG(MODULE_SETTINGS, "Imported route config: " + scheme.name + " by: " + scheme.author)
}
catch (exception e)
{
LOG(MODULE_UI, "Exception: " + QString(e.what()))
// TODO: Give some error as Notification
}
}
/**
* @brief RouteSettingsMatrixWidget::on_exportSchemeBtn_clicked
* @author DuckSoft <realducksoft@gmail.com>
*/
void RouteSettingsMatrixWidget::on_exportSchemeBtn_clicked()
{
try
{
// parse the config back from the window components
auto config = this->GetRouteConfig();
// init some constants
const auto dialogTitle = tr("Exporting Scheme");
// scheme name?
bool ok = false;
auto schemeName = QInputDialog::getText(this, dialogTitle, tr("Scheme name:"), QLineEdit::Normal, tr("Unnamed Scheme"), &ok);
if (!ok)
return;
// scheme author?
auto schemeAuthor = QInputDialog::getText(this, dialogTitle, tr("Author:"), QLineEdit::Normal, "Anonymous <mystery@example.com>", &ok);
if (!ok)
return;
// scheme description?
auto schemeDescription =
QInputDialog::getText(this, dialogTitle, tr("Description:"), QLineEdit::Normal, tr("The author is too lazy to leave a comment"));
if (!ok)
return;
// where to save?
auto savePath = this->saveFileDialog();
if (!savePath)
return;
// construct the data structure
Qv2rayRouteScheme scheme;
scheme.name = schemeName;
scheme.author = schemeAuthor;
scheme.description = schemeDescription;
scheme.ips = config.ips;
scheme.domains = config.domains;
// serialize and write out
auto content = StructToJsonString(scheme);
StringToFile(content, savePath.value());
// done
// TODO: Give some success as Notification
}
catch (exception)
{
// TODO: Give some error as Notification
}
}
/**
* @brief opens a save dialog and asks user to specify the save path.
* @return the selected file path, if any
* @author DuckSoft <realducksoft@gmail.com>
*/
std::optional<QString> RouteSettingsMatrixWidget::saveFileDialog()
{
QFileDialog dialog;
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setOption(QFileDialog::Option::DontConfirmOverwrite, !true);
dialog.setNameFilter(tr("QvRoute Schemes(*.json)"));
dialog.setAcceptMode(QFileDialog::AcceptMode::AcceptSave);
if (!dialog.exec() || dialog.selectedFiles().length() != 1)
{
return std::nullopt;
}
return dialog.selectedFiles().first();
}
/**
* @brief opens up a dialog and asks user to choose a scheme file.
* @return the selected file path, if any
* @author DuckSoft <realducksoft@gmail.com>
*/
std::optional<QString> RouteSettingsMatrixWidget::openFileDialog()
{
QFileDialog dialog;
dialog.setFileMode(QFileDialog::ExistingFile);
dialog.setNameFilter(tr("QvRoute Schemes(*.json)"));
if (!dialog.exec() || dialog.selectedFiles().length() != 1)
{
return std::nullopt;
}
return dialog.selectedFiles().first();
}

View File

@ -3,7 +3,9 @@
#include "base/models/QvSettingsObject.hpp"
#include "ui_RouteSettingsMatrix.h"
#include <QMenu>
#include <QWidget>
#include <optional>
class RouteSettingsMatrixWidget
: public QWidget
@ -12,11 +14,27 @@ class RouteSettingsMatrixWidget
Q_OBJECT
public:
explicit RouteSettingsMatrixWidget(QWidget *parent = nullptr);
void SetRouteConfig(const Qv2ray::base::config::Qv2rayRouteConfig conf, const QString &assetsDirPath);
RouteSettingsMatrixWidget(const QString &assetsDirPath, QWidget *parent = nullptr);
void SetRouteConfig(const Qv2ray::base::config::Qv2rayRouteConfig &conf);
Qv2ray::base::config::Qv2rayRouteConfig GetRouteConfig() const;
~RouteSettingsMatrixWidget();
private:
std::optional<QString> openFileDialog();
std::optional<QString> saveFileDialog();
QList<QAction *> getBuiltInSchemes();
QAction *schemeToAction(const QString &name, Qv2ray::base::config::Qv2rayRouteConfig scheme);
private:
QMenu *builtInSchemesMenu;
private slots:
void on_importSchemeBtn_clicked();
void on_exportSchemeBtn_clicked();
private:
const QString &assetsDirPath;
private:
Qv2ray::ui::widgets::AutoCompleteTextEdit *directDomainTxt;
Qv2ray::ui::widgets::AutoCompleteTextEdit *proxyDomainTxt;

View File

@ -2,6 +2,14 @@
<ui version="4.0">
<class>RouteSettingsMatrix</class>
<widget class="QWidget" name="RouteSettingsMatrix">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>927</width>
<height>198</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
@ -14,7 +22,45 @@
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1" columnstretch="0,1,1,1">
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1" columnstretch="0,1,1,1,0">
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>IP</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Domain</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QGridLayout" name="directIPLayout"/>
</item>
<item row="2" column="1">
<layout class="QGridLayout" name="directTxtLayout"/>
</item>
<item row="1" column="2">
<layout class="QGridLayout" name="proxyIPLayout"/>
</item>
<item row="2" column="2">
<layout class="QGridLayout" name="proxyTxtLayout"/>
</item>
<item row="1" column="3">
<layout class="QGridLayout" name="blockIPLayout"/>
</item>
<item row="2" column="3">
<layout class="QGridLayout" name="blockTxtLayout"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_80">
<property name="text">
@ -45,52 +91,27 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Domain</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QGridLayout" name="directTxtLayout"/>
</item>
<item row="1" column="2">
<layout class="QGridLayout" name="proxyTxtLayout"/>
</item>
<item row="1" column="3">
<layout class="QGridLayout" name="blockTxtLayout"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>IP</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QGridLayout" name="directIPLayout"/>
</item>
<item row="2" column="2">
<layout class="QGridLayout" name="proxyIPLayout"/>
</item>
<item row="2" column="3">
<layout class="QGridLayout" name="blockIPLayout"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QToolButton" name="toolButton_3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="builtInSchemeBtn">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
@ -99,7 +120,7 @@
<string>Use built-in route schemes</string>
</property>
<property name="text">
<string>Built-in Schemes</string>
<string>Built-in Schemes...</string>
</property>
<property name="popupMode">
<enum>QToolButton::InstantPopup</enum>
@ -108,40 +129,33 @@
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="arrowType">
<enum>Qt::DownArrow</enum>
<enum>Qt::NoArrow</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="importSchemeBtn">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="toolTip">
<string>Import route scheme from file</string>
</property>
<property name="text">
<string>Import Scheme</string>
<string>Import Scheme...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="exportSchemeBtn">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="toolTip">
<string>Export route scheme to file</string>
</property>
<property name="text">
<string>Export Scheme</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Coming soon!</string>
<string>Export Scheme...</string>
</property>
</widget>
</item>

View File

@ -305,42 +305,42 @@
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
<source>Select file to import</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Capture QRCode</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Cannot find a valid QRCode from this region.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Import config file</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Failed to check the validity of the config file.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
<source>Select an image to import</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>QRCode scanning failed</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>Cannot find any QRCode from the image.</source>
<translation></translation>
</message>
@ -1216,11 +1216,11 @@
<name>PreferencesWindow</name>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>Preferences</source>
<translation type="unfinished"></translation>
</message>
@ -1606,13 +1606,13 @@
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
<source>Bold</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
<source>Italic</source>
<translation type="unfinished"></translation>
</message>
@ -1737,13 +1737,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
<source>Enable tProxy Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
<source>to this path: </source>
<translation type="unfinished"></translation>
</message>
@ -1753,115 +1753,115 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<source>Duplicated port numbers detected, please check the port number settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<source>Invalid inbound listening address.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
<source>Open V2ray assets folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
<source>Open V2ray core file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
<source>This will append capabilities to the V2ray executable.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
<source>Qv2ray will copy your V2ray core to this path: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
<source>Qv2ray cannot copy one or both V2ray files from: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>tProxy is not supported on macOS and Windows</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
<source>Apply network toolbar settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
<source>All other modified settings will be applied as well after this object.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
<source>Do you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
<source>Select GFWList in base64</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Download GFWList</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<source>Operation is cancelled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Successfully downloaded GFWList.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Start with boot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Failed to set auto start option.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
<source>V2ray Core Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>V2ray path configuration check passed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>Current version of V2ray is: </source>
<translation type="unfinished"></translation>
</message>
@ -2056,7 +2056,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../src/main.cpp" line="111"/>
<location filename="../src/main.cpp" line="134"/>
<location filename="../src/main.cpp" line="303"/>
<location filename="../src/main.cpp" line="304"/>
<source>Qv2ray will now exit.</source>
<translation></translation>
</message>
@ -2071,57 +2071,57 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="203"/>
<location filename="../src/main.cpp" line="204"/>
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="204"/>
<location filename="../src/main.cpp" line="205"/>
<source> --&gt; USE IT AT YOUR OWN RISK!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="227"/>
<source>Debug version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="299"/>
<location filename="../src/main.cpp" line="300"/>
<source>Qv2ray Cannot Continue</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="300"/>
<location filename="../src/main.cpp" line="301"/>
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="301"/>
<location filename="../src/main.cpp" line="302"/>
<source>Please check if there&apos;s an issue explaining about it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="302"/>
<location filename="../src/main.cpp" line="303"/>
<source>Or submit a new issue if you think this is an error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="346"/>
<location filename="../src/main.cpp" line="347"/>
<source>Dependency Missing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="348"/>
<location filename="../src/main.cpp" line="349"/>
<source>This could be caused by a missing of `openssl` package in your system.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="349"/>
<location filename="../src/main.cpp" line="350"/>
<source>If you are using an AppImage from Github Action, please report a bug.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="347"/>
<location filename="../src/main.cpp" line="348"/>
<source>Cannot find openssl libs</source>
<translation></translation>
</message>
@ -2141,7 +2141,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="350"/>
<location filename="../src/main.cpp" line="351"/>
<source>Technical Details</source>
<translation></translation>
</message>
@ -2164,25 +2164,25 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
<source>Deprecated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
<source>It will be removed or be provided as a plugin in the future.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
<translation type="unfinished"></translation>
</message>
@ -3015,21 +3015,11 @@ p, li { white-space: pre-wrap; }
<source>Use built-in route schemes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Built-in Schemes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import route scheme from file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export route scheme to file</source>
@ -3037,12 +3027,76 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme</source>
<source>Built-in Schemes...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Coming soon!</source>
<source>Import Scheme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RouteSettingsMatrixWidget</name>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
<source>empty scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
<source>v2rayN preset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
<source>Import scheme &apos;%1&apos; by &apos;%2&apos;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
<source>Importing Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
<source>Exporting Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Scheme name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Unnamed Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
<source>Author:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>Description:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>The author is too lazy to leave a comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
<source>QvRoute Schemes(*.json)</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -3243,22 +3297,22 @@ p, li { white-space: pre-wrap; }
<context>
<name>SubscribeEditor</name>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Reload Subscription</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Would you like to reload the subscription?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>Deleting a subscription</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>All connections will be moved to default group, do you want to continue?</source>
<translation type="unfinished"></translation>
</message>

View File

@ -415,42 +415,42 @@
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
<source>Select file to import</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Capture QRCode</source>
<translation>QRCodeをキャプチャ</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Cannot find a valid QRCode from this region.</source>
<translation>QRコードが見つかりません</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Import config file</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Failed to check the validity of the config file.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
<source>Select an image to import</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>QRCode scanning failed</source>
<translation>QRコードのスキャンに失敗しました</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>Cannot find any QRCode from the image.</source>
<translation>QRコードが見つかりません</translation>
</message>
@ -1619,11 +1619,11 @@
<name>PreferencesWindow</name>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>Preferences</source>
<translation></translation>
</message>
@ -2093,13 +2093,13 @@
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
<source>Bold</source>
<translation>Bold</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
<source>Italic</source>
<translation></translation>
</message>
@ -2224,13 +2224,13 @@
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
<source>Enable tProxy Support</source>
<translation>tProxyサポートを有効にする</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
<source>to this path: </source>
<translation>: </translation>
</message>
@ -2240,68 +2240,68 @@
<translation>Qv2rayネットワークツールバーは無効になっており --withToolbarPluginを追加して有効にします</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<source>Duplicated port numbers detected, please check the port number settings.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<source>Invalid inbound listening address.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
<source>Open V2ray assets folder</source>
<translation>V2rayアセットフォルダーを開く</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
<source>Open V2ray core file</source>
<translation>V2rayコアファイルを開く</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
<source>This will append capabilities to the V2ray executable.</source>
<translation>V2ray実行可能ファイルに機能が追加されます</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
<source>Qv2ray will copy your V2ray core to this path: </source>
<translation>Qv2rayはV2rayコアを次のパスにコピーします: </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
<translation>#57:</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
<source>Qv2ray cannot copy one or both V2ray files from: </source>
<translation>Qv2rayはV2rayファイルの一方または両方を以下からコピーできません: </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
<translation>V2ray実行可能ファイルへのsetcapに失敗しました`setcap`</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>tProxy is not supported on macOS and Windows</source>
<translation>tProxyはmacOSおよびWindowsではサポートされていません</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
<source>Apply network toolbar settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
<source>All other modified settings will be applied as well after this object.</source>
<translation>All other modified settings will be applied as well after this object.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
<source>Do you want to continue?</source>
<translation></translation>
</message>
@ -2314,49 +2314,49 @@
<translation type="vanished">Please restart Qv2ray to fully apply this feature.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
<source>Select GFWList in base64</source>
<translation>Base64でGFWListを選択します</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Download GFWList</source>
<translation>GFWListをダウンロードする</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<source>Operation is cancelled.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Successfully downloaded GFWList.</source>
<translation>GFWListを正常にダウンロードしました</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Start with boot</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Failed to set auto start option.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
<source>V2ray Core Settings</source>
<translation>V2ray Core設定</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>V2ray path configuration check passed.</source>
<translation>V2rayパス構成チェックに合格しました</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>Current version of V2ray is: </source>
<translation>V2rayの現在のバージョンは次のとおりです: </translation>
</message>
@ -2487,7 +2487,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../src/main.cpp" line="111"/>
<location filename="../src/main.cpp" line="134"/>
<location filename="../src/main.cpp" line="303"/>
<location filename="../src/main.cpp" line="304"/>
<source>Qv2ray will now exit.</source>
<translation>Qv2rayは終了します</translation>
</message>
@ -2506,12 +2506,12 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="203"/>
<location filename="../src/main.cpp" line="204"/>
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
<translation>Qv2rayをルートとして実行することはできません--I-just-wanna-run-with-rootを使用してください</translation>
</message>
<message>
<location filename="../src/main.cpp" line="204"/>
<location filename="../src/main.cpp" line="205"/>
<source> --&gt; USE IT AT YOUR OWN RISK!</source>
<translation> --&gt; 使</translation>
</message>
@ -2524,42 +2524,42 @@ p, li { white-space: pre-wrap; }
<translation type="vanished">Qv2ray will continue running, but you cannot change the UI language.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="299"/>
<location filename="../src/main.cpp" line="300"/>
<source>Qv2ray Cannot Continue</source>
<translation>Qv2rayを続行できません</translation>
</message>
<message>
<location filename="../src/main.cpp" line="300"/>
<location filename="../src/main.cpp" line="301"/>
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
<translation>Qv2rayを実行しています</translation>
</message>
<message>
<location filename="../src/main.cpp" line="301"/>
<location filename="../src/main.cpp" line="302"/>
<source>Please check if there&apos;s an issue explaining about it.</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="302"/>
<location filename="../src/main.cpp" line="303"/>
<source>Or submit a new issue if you think this is an error.</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="346"/>
<location filename="../src/main.cpp" line="347"/>
<source>Dependency Missing</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="348"/>
<location filename="../src/main.cpp" line="349"/>
<source>This could be caused by a missing of `openssl` package in your system.</source>
<translation> `openssl`</translation>
</message>
<message>
<location filename="../src/main.cpp" line="349"/>
<location filename="../src/main.cpp" line="350"/>
<source>If you are using an AppImage from Github Action, please report a bug.</source>
<translation>Github ActionsのAppImageを使用している場合は</translation>
</message>
<message>
<location filename="../src/main.cpp" line="347"/>
<location filename="../src/main.cpp" line="348"/>
<source>Cannot find openssl libs</source>
<translation>OpenSSLライブラリが見つかりません</translation>
</message>
@ -2579,12 +2579,12 @@ p, li { white-space: pre-wrap; }
<translation>Qv2rayを再起動することです</translation>
</message>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="227"/>
<source>Debug version</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="350"/>
<location filename="../src/main.cpp" line="351"/>
<source>Technical Details</source>
<translation></translation>
</message>
@ -2803,25 +2803,25 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
<source>Deprecated</source>
<translation></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
<translation>PACは非推奨になり使</translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
<source>It will be removed or be provided as a plugin in the future.</source>
<translation></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
<translation>PACは現在も機能しますがV2Rayの組み込みルーティングに切り替えてください</translation>
</message>
@ -3515,9 +3515,8 @@ p, li { white-space: pre-wrap; }
<translation>使</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Built-in Schemes</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
@ -3525,9 +3524,8 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
@ -3535,14 +3533,86 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<source>Coming soon!</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Coming soon!</source>
<translation></translation>
<source>Built-in Schemes...</source>
<translation>...</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme...</source>
<translation>...</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme...</source>
<translation>...</translation>
</message>
</context>
<context>
<name>RouteSettingsMatrixWidget</name>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
<source>empty scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
<source>v2rayN preset</source>
<translation>v2rayN </translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
<source>Import scheme &apos;%1&apos; by &apos;%2&apos;?</source>
<translation>%2%1</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
<source>Importing Scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
<source>Exporting Scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Scheme name:</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Unnamed Scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
<source>Author:</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>Description:</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>The author is too lazy to leave a comment</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
<source>QvRoute Schemes(*.json)</source>
<translation>QvRouteスキーム(* .json)</translation>
</message>
</context>
<context>
@ -3782,22 +3852,22 @@ p, li { white-space: pre-wrap; }
<translation type="vanished">Failed to process the result from the upstream, please check your Url.</translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Reload Subscription</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Would you like to reload the subscription?</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>Deleting a subscription</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>All connections will be moved to default group, do you want to continue?</source>
<translation></translation>
</message>

View File

@ -399,42 +399,42 @@
<translation>Отмена</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
<source>Select file to import</source>
<translation>Выберите файл для Импорта</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Capture QRCode</source>
<translation>Захват QRCode</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Cannot find a valid QRCode from this region.</source>
<translation>Не удается найти QRCode из этой области.</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Import config file</source>
<translation>Выберите файл конфигурации</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Failed to check the validity of the config file.</source>
<translation>Не удалось проверить правильность файла конфигурации.</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
<source>Select an image to import</source>
<translation>Выберите изображение для импорта</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>QRCode scanning failed</source>
<translation>Ошибка сканирования QRCode</translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>Cannot find any QRCode from the image.</source>
<translation>Не удается найти QRCode в изображении.</translation>
</message>
@ -1603,11 +1603,11 @@
<name>PreferencesWindow</name>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>Preferences</source>
<translation>Настройки</translation>
</message>
@ -2077,13 +2077,13 @@
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
<source>Bold</source>
<translation>Жирный</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
<source>Italic</source>
<translation>Курсив</translation>
</message>
@ -2208,13 +2208,13 @@
<translation>Объекты</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
<source>Enable tProxy Support</source>
<translation>Включить tProxy поддержку</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
<source>to this path: </source>
<translation>на этот путь: </translation>
</message>
@ -2224,68 +2224,68 @@
<translation>Панель инструментов сети Qv2ray отключена и все еще тестируется. Добавьте --withToolbarPlugin для включения.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<source>Duplicated port numbers detected, please check the port number settings.</source>
<translation>Обнаружены дублированные номера портов, проверьте настройки номера порта.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<source>Invalid inbound listening address.</source>
<translation>Неверный входящий адрес прослушивания.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
<source>Open V2ray assets folder</source>
<translation>Откройте папку активов v2ray</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
<source>Open V2ray core file</source>
<translation>Открыть основной файл V2ray</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
<source>This will append capabilities to the V2ray executable.</source>
<translation>Это добавит возможности к исполняемому файлу V2ray.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
<source>Qv2ray will copy your V2ray core to this path: </source>
<translation>Qv2ray скопирует ваше ядро V2ray по этому пути:</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
<translation>Если после включения этого параметра что-то пойдет не так, проверьте проблему 57 или ссылку ниже:</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
<source>Qv2ray cannot copy one or both V2ray files from: </source>
<translation>Qv2ray не может скопировать один или оба файла V2ray из:</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
<translation>Не удалось установить setcap на исполняемый файл V2ray. Возможно, вам придется запустить `setcap` вручную.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>tProxy is not supported on macOS and Windows</source>
<translation>tProxy не поддерживается на macOS и Windows</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
<source>Apply network toolbar settings</source>
<translation>Применить настройки панели инструментов сети</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
<source>All other modified settings will be applied as well after this object.</source>
<translation>Все остальные измененные настройки будут применены и после этого объекта.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
<source>Do you want to continue?</source>
<translation>Вы хотите продолжить?</translation>
</message>
@ -2298,49 +2298,49 @@
<translation type="vanished">Пожалуйста, перезапустите Qv2ray, чтобы полностью применить эту функцию.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
<source>Select GFWList in base64</source>
<translation>Выберите GFWList в base64</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Download GFWList</source>
<translation>Скачать GFWList</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<source>Operation is cancelled.</source>
<translation>Операция отменена.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Successfully downloaded GFWList.</source>
<translation>Успешно загружено %1$s.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Start with boot</source>
<translation>Автозапуск</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Failed to set auto start option.</source>
<translation>Не удалось установить опцию автозапуска.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
<source>V2ray Core Settings</source>
<translation>Настройки ядра V2ray</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>V2ray path configuration check passed.</source>
<translation>Проверка конфигурации пути V2ray пройдена.</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>Current version of V2ray is: </source>
<translation>Текущая версия V2ray:</translation>
</message>
@ -2459,7 +2459,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../src/main.cpp" line="111"/>
<location filename="../src/main.cpp" line="134"/>
<location filename="../src/main.cpp" line="303"/>
<location filename="../src/main.cpp" line="304"/>
<source>Qv2ray will now exit.</source>
<translation>Qv2ray теперь выйдет.</translation>
</message>
@ -2478,12 +2478,12 @@ p, li { white-space: pre-wrap; }
<translation>Пожалуйста, сообщите, если вы считаете об этом, если это ошибка.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="203"/>
<location filename="../src/main.cpp" line="204"/>
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
<translation>Вы не можете запустить Qv2ray как root, пожалуйста, используйте --I-just-wanna-run-with-root, если вы хотите это сделать.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="204"/>
<location filename="../src/main.cpp" line="205"/>
<source> --&gt; USE IT AT YOUR OWN RISK!</source>
<translation> --&gt; ИСПОЛЬЗУЙТЕ ЕГО НА СВОЙ СТРАХ И РИСК!</translation>
</message>
@ -2496,42 +2496,42 @@ p, li { white-space: pre-wrap; }
<translation type="vanished">Qv2ray продолжит работу, но вы не сможете изменить язык интерфейса.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="299"/>
<location filename="../src/main.cpp" line="300"/>
<source>Qv2ray Cannot Continue</source>
<translation>Qv2ray не может продолжить</translation>
</message>
<message>
<location filename="../src/main.cpp" line="300"/>
<location filename="../src/main.cpp" line="301"/>
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
<translation>Вы используете более низкую версию Qv2ray по сравнению с текущим файлом конфигурации.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="301"/>
<location filename="../src/main.cpp" line="302"/>
<source>Please check if there&apos;s an issue explaining about it.</source>
<translation>Пожалуйста, проверьте, есть ли проблема с объяснением этого.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="302"/>
<location filename="../src/main.cpp" line="303"/>
<source>Or submit a new issue if you think this is an error.</source>
<translation>Или отправьте новую проблему, если вы считаете, что это ошибка.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="346"/>
<location filename="../src/main.cpp" line="347"/>
<source>Dependency Missing</source>
<translation>Зависимость отсутствует</translation>
</message>
<message>
<location filename="../src/main.cpp" line="348"/>
<location filename="../src/main.cpp" line="349"/>
<source>This could be caused by a missing of `openssl` package in your system.</source>
<translation>Это может быть вызвано отсутствием пакета `openssl` в вашей системе.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="349"/>
<location filename="../src/main.cpp" line="350"/>
<source>If you are using an AppImage from Github Action, please report a bug.</source>
<translation>Если вы используете AppImage из Github Action, пожалуйста, сообщите об ошибке.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="347"/>
<location filename="../src/main.cpp" line="348"/>
<source>Cannot find openssl libs</source>
<translation>Не удается найти openssl libs</translation>
</message>
@ -2551,12 +2551,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="227"/>
<source>Debug version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="350"/>
<location filename="../src/main.cpp" line="351"/>
<source>Technical Details</source>
<translation>Технические детали</translation>
</message>
@ -2775,25 +2775,25 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
<source>Deprecated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
<source>It will be removed or be provided as a plugin in the future.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
<translation type="unfinished"></translation>
</message>
@ -3486,21 +3486,11 @@ p, li { white-space: pre-wrap; }
<source>Use built-in route schemes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Built-in Schemes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import route scheme from file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export route scheme to file</source>
@ -3508,12 +3498,76 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme</source>
<source>Built-in Schemes...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Coming soon!</source>
<source>Import Scheme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RouteSettingsMatrixWidget</name>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
<source>empty scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
<source>v2rayN preset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
<source>Import scheme &apos;%1&apos; by &apos;%2&apos;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
<source>Importing Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
<source>Exporting Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Scheme name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Unnamed Scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
<source>Author:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>Description:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>The author is too lazy to leave a comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
<source>QvRoute Schemes(*.json)</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -3754,22 +3808,22 @@ p, li { white-space: pre-wrap; }
<translation type="vanished">Не удалось обработать результат из апстрима, проверьте ваш URL.</translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Reload Subscription</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Would you like to reload the subscription?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>Deleting a subscription</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>All connections will be moved to default group, do you want to continue?</source>
<translation type="unfinished"></translation>
</message>

View File

@ -320,42 +320,42 @@
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
<source>Select file to import</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Capture QRCode</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Cannot find a valid QRCode from this region.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Import config file</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
<source>Failed to check the validity of the config file.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
<source>Select an image to import</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>QRCode scanning failed</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
<source>Cannot find any QRCode from the image.</source>
<translation></translation>
</message>
@ -1257,11 +1257,11 @@
<name>PreferencesWindow</name>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>Preferences</source>
<translation></translation>
</message>
@ -1651,13 +1651,13 @@
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
<source>Bold</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
<source>Italic</source>
<translation></translation>
</message>
@ -1782,13 +1782,13 @@
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
<source>Enable tProxy Support</source>
<translation> tProxy </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
<source>to this path: </source>
<translation>: </translation>
</message>
@ -1798,115 +1798,115 @@
<translation>Qv2ray 使 --withToolbarPlugin </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<source>Duplicated port numbers detected, please check the port number settings.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<source>Invalid inbound listening address.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
<source>Open V2ray assets folder</source>
<translation> V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
<source>Open V2ray core file</source>
<translation> V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
<source>This will append capabilities to the V2ray executable.</source>
<translation> V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
<source>Qv2ray will copy your V2ray core to this path: </source>
<translation>Qv2ray V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
<translation> Issue #57 </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
<source>Qv2ray cannot copy one or both V2ray files from: </source>
<translation>Qv2ray V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
<translation> Capcap V2ray setcap</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>tProxy is not supported on macOS and Windows</source>
<translation> macOS Windows tProxy</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
<source>Apply network toolbar settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
<source>All other modified settings will be applied as well after this object.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
<source>Do you want to continue?</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
<source>Select GFWList in base64</source>
<translation> base64 GFWList</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Download GFWList</source>
<translation> GFWList</translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<source>Operation is cancelled.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Successfully downloaded GFWList.</source>
<translation> GFWList </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Start with boot</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
<source>Failed to set auto start option.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
<source>V2ray Core Settings</source>
<translation>V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>V2ray path configuration check passed.</source>
<translation>V2ray </translation>
</message>
<message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
<source>Current version of V2ray is: </source>
<translation>V2ray </translation>
</message>
@ -2113,7 +2113,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../src/main.cpp" line="111"/>
<location filename="../src/main.cpp" line="134"/>
<location filename="../src/main.cpp" line="303"/>
<location filename="../src/main.cpp" line="304"/>
<source>Qv2ray will now exit.</source>
<translation>Qv2ray 退</translation>
</message>
@ -2128,57 +2128,57 @@ p, li { white-space: pre-wrap; }
<translation>bug&apos;</translation>
</message>
<message>
<location filename="../src/main.cpp" line="203"/>
<location filename="../src/main.cpp" line="204"/>
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
<translation>root用户身份运行Qv2ray使 --I-just-wanna-run-with-root</translation>
</message>
<message>
<location filename="../src/main.cpp" line="204"/>
<location filename="../src/main.cpp" line="205"/>
<source> --&gt; USE IT AT YOUR OWN RISK!</source>
<translation> --&gt; </translation>
</message>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="227"/>
<source>Debug version</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="299"/>
<location filename="../src/main.cpp" line="300"/>
<source>Qv2ray Cannot Continue</source>
<translation>Qv2ray </translation>
</message>
<message>
<location filename="../src/main.cpp" line="300"/>
<location filename="../src/main.cpp" line="301"/>
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
<translation> Qv2ray</translation>
</message>
<message>
<location filename="../src/main.cpp" line="301"/>
<location filename="../src/main.cpp" line="302"/>
<source>Please check if there&apos;s an issue explaining about it.</source>
<translation>&apos;</translation>
</message>
<message>
<location filename="../src/main.cpp" line="302"/>
<location filename="../src/main.cpp" line="303"/>
<source>Or submit a new issue if you think this is an error.</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="346"/>
<location filename="../src/main.cpp" line="347"/>
<source>Dependency Missing</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="348"/>
<location filename="../src/main.cpp" line="349"/>
<source>This could be caused by a missing of `openssl` package in your system.</source>
<translation>`openssl`</translation>
</message>
<message>
<location filename="../src/main.cpp" line="349"/>
<location filename="../src/main.cpp" line="350"/>
<source>If you are using an AppImage from Github Action, please report a bug.</source>
<translation>使 Github Action AppImage</translation>
</message>
<message>
<location filename="../src/main.cpp" line="347"/>
<location filename="../src/main.cpp" line="348"/>
<source>Cannot find openssl libs</source>
<translation> OpenSSL </translation>
</message>
@ -2198,7 +2198,7 @@ p, li { white-space: pre-wrap; }
<translation>Qv2ray</translation>
</message>
<message>
<location filename="../src/main.cpp" line="350"/>
<location filename="../src/main.cpp" line="351"/>
<source>Technical Details</source>
<translation></translation>
</message>
@ -2237,25 +2237,25 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
<source>Deprecated</source>
<translation></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
<translation>PAC 使</translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
<source>It will be removed or be provided as a plugin in the future.</source>
<translation></translation>
</message>
<message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
<translation>PAC 使 V2ray </translation>
</message>
@ -3089,9 +3089,8 @@ p, li { white-space: pre-wrap; }
<translation>使</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Built-in Schemes</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
@ -3099,9 +3098,8 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
@ -3109,14 +3107,86 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<source>Coming soon!</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Coming soon!</source>
<translation></translation>
<source>Built-in Schemes...</source>
<translation>...</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme...</source>
<translation>...</translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme...</source>
<translation>...</translation>
</message>
</context>
<context>
<name>RouteSettingsMatrixWidget</name>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
<source>empty scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
<source>v2rayN preset</source>
<translation>v2rayN </translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
<source>Import scheme &apos;%1&apos; by &apos;%2&apos;?</source>
<translation> &apos;%2&apos; &apos;%1&apos; </translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
<source>Importing Scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
<source>Exporting Scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Scheme name:</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
<source>Unnamed Scheme</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
<source>Author:</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>Description:</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
<source>The author is too lazy to leave a comment</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
<source>QvRoute Schemes(*.json)</source>
<translation>QvRoute (*.json)</translation>
</message>
</context>
<context>
@ -3320,22 +3390,22 @@ p, li { white-space: pre-wrap; }
<context>
<name>SubscribeEditor</name>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Reload Subscription</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Would you like to reload the subscription?</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>Deleting a subscription</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
<source>All connections will be moved to default group, do you want to continue?</source>
<translation></translation>
</message>