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/ .vs/
*.qm *.qm
./.vscode ./.vscode
CMakeSettings.json
SourceTrail/ SourceTrail/

View File

@ -1,11 +1,22 @@
# Qv2ray - Make v2ray real cross-platform # 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) [![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 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) [![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 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。 使用 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 qv2ray (2.2.3-1) unstable; urgency=medium
* Initial release * 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; bool debugLog;
/// Enable Network toolbar plugin. /// Enable Network toolbar plugin.
bool enableToolbarPlguin; bool enableToolbarPlguin;
/// Endable HiDPI support. /// Disable Qt scale factors support.
bool hiDPI; bool noScaleFactors;
/// Force endable HiDPI support.
bool forceHiDPI;
}; };
} // namespace base } // namespace base
inline base::QvStartupOptions StartupOption = base::QvStartupOptions(); inline base::QvStartupOptions StartupOption = base::QvStartupOptions();

View File

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

View File

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

View File

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

View File

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

View File

@ -6,7 +6,7 @@ namespace Qv2ray::core::connection
{ {
namespace ConnectionIO namespace ConnectionIO
{ {
CONFIGROOT ConvertConfigFromFile(QString sourceFilePath, bool importComplex) CONFIGROOT ConvertConfigFromFile(const QString &sourceFilePath, bool importComplex)
{ {
QFile source(sourceFilePath); QFile source(sourceFilePath);
@ -15,7 +15,7 @@ namespace Qv2ray::core::connection
LOG(MODULE_FILEIO, "Trying to import from an non-existing file.") return CONFIGROOT(); 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) if (!importComplex)
{ {

View File

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

View File

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

View File

@ -1,3 +1,4 @@
#pragma once
#include "base/Qv2rayBase.hpp" #include "base/Qv2rayBase.hpp"
#include "core/CoreSafeTypes.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 // Verify JSON file format. (only) because this file version may
// not be upgraded and may contain unsupported structure. // not be upgraded and may contain unsupported structure.
auto err = VerifyJsonString(StringFromFile(&configFile)); auto err = VerifyJsonString(StringFromFile(configFile));
if (!err.isEmpty()) if (!err.isEmpty())
{ {
@ -96,7 +96,7 @@ namespace Qv2ray::core::config
else else
{ {
// If the file format is valid. // If the file format is valid.
auto conf = JsonFromString(StringFromFile(&configFile)); auto conf = JsonFromString(StringFromFile(configFile));
LOG(MODULE_SETTINGS, LOG(MODULE_SETTINGS,
"Path: " + path + " contains a config file, in version " + conf["config_version"].toVariant().toString()) "Path: " + path + " contains a config file, in version " + conf["config_version"].toVariant().toString())
configFile.close(); configFile.close();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -34,6 +34,7 @@ class MainWindow
public: public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QWidget *parent = nullptr);
~MainWindow() override; ~MainWindow() override;
static MainWindow *mwInstance;
signals: signals:
void StartConnection() const; void StartConnection() const;
void StopConnection() const; void StopConnection() const;
@ -42,47 +43,29 @@ class MainWindow
private: private:
QvMessageBusSlotDecl; QvMessageBusSlotDecl;
private slots: private slots:
#ifndef DISABLE_AUTO_UPDATE
void VersionUpdate(QByteArray &data);
#endif
void on_activatedTray(QSystemTrayIcon::ActivationReason reason); void on_activatedTray(QSystemTrayIcon::ActivationReason reason);
void on_actionExit_triggered();
void on_preferencesBtn_clicked(); void on_preferencesBtn_clicked();
void on_clearlogButton_clicked(); void on_clearlogButton_clicked();
void on_connectionListWidget_customContextMenuRequested(const QPoint &pos); void on_connectionListWidget_customContextMenuRequested(const QPoint &pos);
void on_importConfigButton_clicked(); void on_importConfigButton_clicked();
void on_subsButton_clicked(); void on_subsButton_clicked();
// //
void ToggleVisibility(); void on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
#ifndef DISABLE_AUTO_UPDATE void on_connectionFilterTxt_textEdited(const QString &arg1);
void VersionUpdate(QByteArray &data); void on_connectionListWidget_itemClicked(QTreeWidgetItem *item, int column);
#endif 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: private:
static MainWindow *mwInstance; void on_actionExit_triggered();
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);
//
void on_action_StartThis_triggered(); void on_action_StartThis_triggered();
void on_action_RCM_SetAutoConnection_triggered(); void on_action_RCM_SetAutoConnection_triggered();
void on_action_RCM_EditThis_triggered(); void on_action_RCM_EditThis_triggered();
@ -96,23 +79,33 @@ class MainWindow
void on_action_RCM_tovCoreLog_triggered(); void on_action_RCM_tovCoreLog_triggered();
void on_action_RCM_toQvLog_triggered(); void on_action_RCM_toQvLog_triggered();
// //
void on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column); void OnConnectionWidgetFocusRequested(const ConnectionItemWidget *widget);
void on_connectionFilterTxt_textEdited(const QString &arg1); //
void on_connectionListWidget_itemClicked(QTreeWidgetItem *item, int column); void ToggleVisibility();
void on_locateBtn_clicked(); 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 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(); void on_pluginsBtn_clicked();
protected: protected:
void timerEvent(QTimerEvent *event) override; void timerEvent(QTimerEvent *event) override;
void keyPressEvent(QKeyEvent *e) override;
void keyReleaseEvent(QKeyEvent *e) override;
void closeEvent(QCloseEvent *) override;
private: private:
QHash<GroupId, shared_ptr<QTreeWidgetItem>> groupNodes; QHash<GroupId, shared_ptr<QTreeWidgetItem>> groupNodes;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,38 +3,27 @@
#include "common/QvHelpers.hpp" #include "common/QvHelpers.hpp"
#include "components/geosite/QvGeositeReader.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); setupUi(this);
// //
directDomainTxt = new AutoCompleteTextEdit("geosite", this); builtInSchemesMenu = new QMenu(this);
proxyDomainTxt = new AutoCompleteTextEdit("geosite", this); builtInSchemesMenu->addActions(this->getBuiltInSchemes());
blockDomainTxt = new AutoCompleteTextEdit("geosite", this); builtInSchemeBtn->setMenu(builtInSchemesMenu);
//
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));
// //
auto sourceStringsDomain = ReadGeoSiteFromFile(assetsDirPath + "/geosite.dat"); auto sourceStringsDomain = ReadGeoSiteFromFile(assetsDirPath + "/geosite.dat");
directDomainTxt->SetSourceStrings(sourceStringsDomain); directDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
proxyDomainTxt->SetSourceStrings(sourceStringsDomain); proxyDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
blockDomainTxt->SetSourceStrings(sourceStringsDomain); blockDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
// //
auto sourceStringsIP = ReadGeoSiteFromFile(assetsDirPath + "/geoip.dat"); auto sourceStringsIP = ReadGeoSiteFromFile(assetsDirPath + "/geoip.dat");
directIPTxt->SetSourceStrings(sourceStringsIP); directIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
proxyIPTxt->SetSourceStrings(sourceStringsIP); proxyIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
blockIPTxt->SetSourceStrings(sourceStringsIP); blockIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
// //
directTxtLayout->addWidget(directDomainTxt, 0, 0); directTxtLayout->addWidget(directDomainTxt, 0, 0);
proxyTxtLayout->addWidget(proxyDomainTxt, 0, 0); proxyTxtLayout->addWidget(proxyDomainTxt, 0, 0);
@ -43,6 +32,195 @@ void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig c
directIPLayout->addWidget(directIPTxt, 0, 0); directIPLayout->addWidget(directIPTxt, 0, 0);
proxyIPLayout->addWidget(proxyIPTxt, 0, 0); proxyIPLayout->addWidget(proxyIPTxt, 0, 0);
blockIPLayout->addWidget(blockIPTxt, 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 config::Qv2rayRouteConfig RouteSettingsMatrixWidget::GetRouteConfig() const
@ -61,3 +239,164 @@ config::Qv2rayRouteConfig RouteSettingsMatrixWidget::GetRouteConfig() const
RouteSettingsMatrixWidget::~RouteSettingsMatrixWidget() 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 "base/models/QvSettingsObject.hpp"
#include "ui_RouteSettingsMatrix.h" #include "ui_RouteSettingsMatrix.h"
#include <QMenu>
#include <QWidget> #include <QWidget>
#include <optional>
class RouteSettingsMatrixWidget class RouteSettingsMatrixWidget
: public QWidget : public QWidget
@ -12,11 +14,27 @@ class RouteSettingsMatrixWidget
Q_OBJECT Q_OBJECT
public: public:
explicit RouteSettingsMatrixWidget(QWidget *parent = nullptr); RouteSettingsMatrixWidget(const QString &assetsDirPath, QWidget *parent = nullptr);
void SetRouteConfig(const Qv2ray::base::config::Qv2rayRouteConfig conf, const QString &assetsDirPath); void SetRouteConfig(const Qv2ray::base::config::Qv2rayRouteConfig &conf);
Qv2ray::base::config::Qv2rayRouteConfig GetRouteConfig() const; Qv2ray::base::config::Qv2rayRouteConfig GetRouteConfig() const;
~RouteSettingsMatrixWidget(); ~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: private:
Qv2ray::ui::widgets::AutoCompleteTextEdit *directDomainTxt; Qv2ray::ui::widgets::AutoCompleteTextEdit *directDomainTxt;
Qv2ray::ui::widgets::AutoCompleteTextEdit *proxyDomainTxt; Qv2ray::ui::widgets::AutoCompleteTextEdit *proxyDomainTxt;

View File

@ -2,6 +2,14 @@
<ui version="4.0"> <ui version="4.0">
<class>RouteSettingsMatrix</class> <class>RouteSettingsMatrix</class>
<widget class="QWidget" name="RouteSettingsMatrix"> <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"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
@ -14,7 +22,45 @@
</widget> </widget>
</item> </item>
<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"> <item row="0" column="1">
<widget class="QLabel" name="label_80"> <widget class="QLabel" name="label_80">
<property name="text"> <property name="text">
@ -45,52 +91,27 @@
</property> </property>
</widget> </widget>
</item> </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> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <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"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="contextMenuPolicy"> <property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum> <enum>Qt::CustomContextMenu</enum>
@ -99,7 +120,7 @@
<string>Use built-in route schemes</string> <string>Use built-in route schemes</string>
</property> </property>
<property name="text"> <property name="text">
<string>Built-in Schemes</string> <string>Built-in Schemes...</string>
</property> </property>
<property name="popupMode"> <property name="popupMode">
<enum>QToolButton::InstantPopup</enum> <enum>QToolButton::InstantPopup</enum>
@ -108,40 +129,33 @@
<enum>Qt::ToolButtonTextBesideIcon</enum> <enum>Qt::ToolButtonTextBesideIcon</enum>
</property> </property>
<property name="arrowType"> <property name="arrowType">
<enum>Qt::DownArrow</enum> <enum>Qt::NoArrow</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="importSchemeBtn"> <widget class="QPushButton" name="importSchemeBtn">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Import route scheme from file</string> <string>Import route scheme from file</string>
</property> </property>
<property name="text"> <property name="text">
<string>Import Scheme</string> <string>Import Scheme...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="exportSchemeBtn"> <widget class="QPushButton" name="exportSchemeBtn">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Export route scheme to file</string> <string>Export route scheme to file</string>
</property> </property>
<property name="text"> <property name="text">
<string>Export Scheme</string> <string>Export Scheme...</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Coming soon!</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -305,42 +305,42 @@
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Select file to import</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/> <location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Capture QRCode</source> <source>Capture QRCode</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Cannot find a valid QRCode from this region.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Import config file</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Failed to check the validity of the config file.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Select an image to import</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>QRCode scanning failed</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Cannot find any QRCode from the image.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1216,11 +1216,11 @@
<name>PreferencesWindow</name> <name>PreferencesWindow</name>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.ui"/> <location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>Preferences</source> <source>Preferences</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1606,13 +1606,13 @@
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.ui"/> <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> <source>Bold</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.ui"/> <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> <source>Italic</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1737,13 +1737,13 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
<source>Enable tProxy Support</source> <source>Enable tProxy Support</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>to this path: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1753,115 +1753,115 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Duplicated port numbers detected, please check the port number settings.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Invalid inbound listening address.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Open V2ray assets folder</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Open V2ray core file</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>This will append capabilities to the V2ray executable.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Qv2ray will copy your V2ray core to this path: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Qv2ray cannot copy one or both V2ray files from: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source> <source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>tProxy is not supported on macOS and Windows</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Apply network toolbar settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>All other modified settings will be applied as well after this object.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Do you want to continue?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Select GFWList in base64</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Download GFWList</source> <source>Download GFWList</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Operation is cancelled.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Successfully downloaded GFWList.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Start with boot</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Failed to set auto start option.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
<source>V2ray Core Settings</source> <source>V2ray Core Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>V2ray path configuration check passed.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Current version of V2ray is: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2056,7 +2056,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location filename="../src/main.cpp" line="111"/> <location filename="../src/main.cpp" line="111"/>
<location filename="../src/main.cpp" line="134"/> <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> <source>Qv2ray will now exit.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2071,57 +2071,57 @@ p, li { white-space: pre-wrap; }
<translation></translation> <translation></translation>
</message> </message>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<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> <source> --&gt; USE IT AT YOUR OWN RISK!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="226"/> <location filename="../src/main.cpp" line="227"/>
<source>Debug version</source> <source>Debug version</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="299"/> <location filename="../src/main.cpp" line="300"/>
<source>Qv2ray Cannot Continue</source> <source>Qv2ray Cannot Continue</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>You are running a lower version of Qv2ray compared to the current config file.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Please check if there&apos;s an issue explaining about it.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Or submit a new issue if you think this is an error.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="346"/> <location filename="../src/main.cpp" line="347"/>
<source>Dependency Missing</source> <source>Dependency Missing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>This could be caused by a missing of `openssl` package in your system.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>If you are using an AppImage from Github Action, please report a bug.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="347"/> <location filename="../src/main.cpp" line="348"/>
<source>Cannot find openssl libs</source> <source>Cannot find openssl libs</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2141,7 +2141,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="350"/> <location filename="../src/main.cpp" line="351"/>
<source>Technical Details</source> <source>Technical Details</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2164,25 +2164,25 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/> <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> <source>Deprecated</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/> <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> <source>PAC is now deprecated and is not encouraged to be used anymore.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/> <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> <source>It will be removed or be provided as a plugin in the future.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/> <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> <source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -3015,21 +3015,11 @@ p, li { white-space: pre-wrap; }
<source>Use built-in route schemes</source> <source>Use built-in route schemes</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Built-in Schemes</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import route scheme from file</source> <source>Import route scheme from file</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export route scheme to file</source> <source>Export route scheme to file</source>
@ -3037,12 +3027,76 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme</source> <source>Built-in Schemes...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <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> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@ -3243,22 +3297,22 @@ p, li { white-space: pre-wrap; }
<context> <context>
<name>SubscribeEditor</name> <name>SubscribeEditor</name>
<message> <message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/> <location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Reload Subscription</source> <source>Reload Subscription</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Would you like to reload the subscription?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Deleting a subscription</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>All connections will be moved to default group, do you want to continue?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

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

View File

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

View File

@ -320,42 +320,42 @@
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Select file to import</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/> <location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
<source>Capture QRCode</source> <source>Capture QRCode</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Cannot find a valid QRCode from this region.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Import config file</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Failed to check the validity of the config file.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Select an image to import</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>QRCode scanning failed</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Cannot find any QRCode from the image.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1257,11 +1257,11 @@
<name>PreferencesWindow</name> <name>PreferencesWindow</name>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.ui"/> <location filename="../src/ui/w_PreferencesWindow.ui"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
<source>Preferences</source> <source>Preferences</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1651,13 +1651,13 @@
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.ui"/> <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> <source>Bold</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.ui"/> <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> <source>Italic</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1782,13 +1782,13 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
<source>Enable tProxy Support</source> <source>Enable tProxy Support</source>
<translation> tProxy </translation> <translation> tProxy </translation>
</message> </message>
<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> <source>to this path: </source>
<translation>: </translation> <translation>: </translation>
</message> </message>
@ -1798,115 +1798,115 @@
<translation>Qv2ray 使 --withToolbarPlugin </translation> <translation>Qv2ray 使 --withToolbarPlugin </translation>
</message> </message>
<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> <source>Duplicated port numbers detected, please check the port number settings.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Invalid inbound listening address.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Open V2ray assets folder</source>
<translation> V2ray </translation> <translation> V2ray </translation>
</message> </message>
<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> <source>Open V2ray core file</source>
<translation> V2ray </translation> <translation> V2ray </translation>
</message> </message>
<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> <source>This will append capabilities to the V2ray executable.</source>
<translation> V2ray </translation> <translation> V2ray </translation>
</message> </message>
<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> <source>Qv2ray will copy your V2ray core to this path: </source>
<translation>Qv2ray V2ray </translation> <translation>Qv2ray V2ray </translation>
</message> </message>
<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> <source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
<translation> Issue #57 </translation> <translation> Issue #57 </translation>
</message> </message>
<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> <source>Qv2ray cannot copy one or both V2ray files from: </source>
<translation>Qv2ray V2ray </translation> <translation>Qv2ray V2ray </translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source> <source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
<translation> Capcap V2ray setcap</translation> <translation> Capcap V2ray setcap</translation>
</message> </message>
<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> <source>tProxy is not supported on macOS and Windows</source>
<translation> macOS Windows tProxy</translation> <translation> macOS Windows tProxy</translation>
</message> </message>
<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> <source>Apply network toolbar settings</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>All other modified settings will be applied as well after this object.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Do you want to continue?</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Select GFWList in base64</source>
<translation> base64 GFWList</translation> <translation> base64 GFWList</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
<source>Download GFWList</source> <source>Download GFWList</source>
<translation> GFWList</translation> <translation> GFWList</translation>
</message> </message>
<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> <source>Operation is cancelled.</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Successfully downloaded GFWList.</source>
<translation> GFWList </translation> <translation> GFWList </translation>
</message> </message>
<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> <source>Start with boot</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Failed to set auto start option.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/> <location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
<source>V2ray Core Settings</source> <source>V2ray Core Settings</source>
<translation>V2ray </translation> <translation>V2ray </translation>
</message> </message>
<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> <source>V2ray path configuration check passed.</source>
<translation>V2ray </translation> <translation>V2ray </translation>
</message> </message>
<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> <source>Current version of V2ray is: </source>
<translation>V2ray </translation> <translation>V2ray </translation>
</message> </message>
@ -2113,7 +2113,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location filename="../src/main.cpp" line="111"/> <location filename="../src/main.cpp" line="111"/>
<location filename="../src/main.cpp" line="134"/> <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> <source>Qv2ray will now exit.</source>
<translation>Qv2ray 退</translation> <translation>Qv2ray 退</translation>
</message> </message>
@ -2128,57 +2128,57 @@ p, li { white-space: pre-wrap; }
<translation>bug&apos;</translation> <translation>bug&apos;</translation>
</message> </message>
<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> <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> <translation>root用户身份运行Qv2ray使 --I-just-wanna-run-with-root</translation>
</message> </message>
<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> <source> --&gt; USE IT AT YOUR OWN RISK!</source>
<translation> --&gt; </translation> <translation> --&gt; </translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="226"/> <location filename="../src/main.cpp" line="227"/>
<source>Debug version</source> <source>Debug version</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="299"/> <location filename="../src/main.cpp" line="300"/>
<source>Qv2ray Cannot Continue</source> <source>Qv2ray Cannot Continue</source>
<translation>Qv2ray </translation> <translation>Qv2ray </translation>
</message> </message>
<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> <source>You are running a lower version of Qv2ray compared to the current config file.</source>
<translation> Qv2ray</translation> <translation> Qv2ray</translation>
</message> </message>
<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> <source>Please check if there&apos;s an issue explaining about it.</source>
<translation>&apos;</translation> <translation>&apos;</translation>
</message> </message>
<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> <source>Or submit a new issue if you think this is an error.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="346"/> <location filename="../src/main.cpp" line="347"/>
<source>Dependency Missing</source> <source>Dependency Missing</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>This could be caused by a missing of `openssl` package in your system.</source>
<translation>`openssl`</translation> <translation>`openssl`</translation>
</message> </message>
<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> <source>If you are using an AppImage from Github Action, please report a bug.</source>
<translation>使 Github Action AppImage</translation> <translation>使 Github Action AppImage</translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="347"/> <location filename="../src/main.cpp" line="348"/>
<source>Cannot find openssl libs</source> <source>Cannot find openssl libs</source>
<translation> OpenSSL </translation> <translation> OpenSSL </translation>
</message> </message>
@ -2198,7 +2198,7 @@ p, li { white-space: pre-wrap; }
<translation>Qv2ray</translation> <translation>Qv2ray</translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="350"/> <location filename="../src/main.cpp" line="351"/>
<source>Technical Details</source> <source>Technical Details</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2237,25 +2237,25 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/> <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> <source>Deprecated</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/> <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> <source>PAC is now deprecated and is not encouraged to be used anymore.</source>
<translation>PAC 使</translation> <translation>PAC 使</translation>
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/> <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> <source>It will be removed or be provided as a plugin in the future.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/> <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> <source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
<translation>PAC 使 V2ray </translation> <translation>PAC 使 V2ray </translation>
</message> </message>
@ -3089,9 +3089,8 @@ p, li { white-space: pre-wrap; }
<translation>使</translation> <translation>使</translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Built-in Schemes</source> <source>Built-in Schemes</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
@ -3099,9 +3098,8 @@ p, li { white-space: pre-wrap; }
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Import Scheme</source> <source>Import Scheme</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
@ -3109,14 +3107,86 @@ p, li { white-space: pre-wrap; }
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Export Scheme</source> <source>Export Scheme</source>
<translation></translation> <translation type="vanished"></translation>
</message>
<message>
<source>Coming soon!</source>
<translation type="vanished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/> <location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
<source>Coming soon!</source> <source>Built-in Schemes...</source>
<translation></translation> <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> </message>
</context> </context>
<context> <context>
@ -3320,22 +3390,22 @@ p, li { white-space: pre-wrap; }
<context> <context>
<name>SubscribeEditor</name> <name>SubscribeEditor</name>
<message> <message>
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/> <location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
<source>Reload Subscription</source> <source>Reload Subscription</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Would you like to reload the subscription?</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>Deleting a subscription</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <source>All connections will be moved to default group, do you want to continue?</source>
<translation></translation> <translation></translation>
</message> </message>