mirror of
https://github.com/Qv2ray/Qv2ray.git
synced 2025-05-19 02:10:28 +08:00
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:
commit
f08d65c618
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,6 +5,7 @@
|
||||
.vs/
|
||||
*.qm
|
||||
./.vscode
|
||||
CMakeSettings.json
|
||||
|
||||
SourceTrail/
|
||||
|
||||
|
19
README.md
19
README.md
@ -1,11 +1,22 @@
|
||||
# Qv2ray - Make v2ray real cross-platform
|
||||
|
||||
[](https://build.archlinuxcn.org/packages/#/qv2ray)
|
||||
[](https://flathub.org/apps/details/com.github.Qv2ray)
|
||||
[](http://hits.dwyl.io/Qv2ray/Qv2ray)
|
||||

|
||||

|
||||
[](https://github.com/Qv2ray/Qv2ray/releases)
|
||||
[](https://github.com/Qv2ray/Qv2ray/releases)
|
||||
|
||||
[](https://flathub.org/apps/details/com.github.Qv2ray)
|
||||
[](https://snapcraft.io/qv2ray/)
|
||||
|
||||
[](https://aur.archlinux.org/packages/qv2ray)
|
||||
[](https://aur.archlinux.org/packages/qv2ray-dev-git)
|
||||
[](https://build.archlinuxcn.org/packages/#/qv2ray)
|
||||
[](https://build.archlinuxcn.org/packages/#/qv2ray-dev-git)
|
||||
|
||||
[](https://github.com/Qv2ray/Qv2ray/actions?query=workflow%3A%22Build+Qv2ray+AUR%22)
|
||||
[](https://github.com/Qv2ray/Qv2ray/actions?query=workflow%3A%22Qv2ray+build+debian+package%22)
|
||||
[](https://github.com/Qv2ray/Qv2ray/actions?query=workflow%3A%22Qv2ray+build+matrix+-+cmake%22)
|
||||
|
||||
Snap Build Status: [](https://travis-ci.com/Qv2ray/Qv2ray)
|
||||
|
||||
使用 Qt 框架的跨平台 v2ray 客户端。支持 Windows, Linux, macOS。
|
||||
|
||||
|
14
debian/changelog
vendored
14
debian/changelog
vendored
@ -1,3 +1,17 @@
|
||||
qv2ray (2.3.1-1) unstable; urgency=medium
|
||||
|
||||
* fixed file loading if a source file was not in UTF-8
|
||||
|
||||
-- Guobang Bi <ymshenyu@gmail.com> Sat, 21 Mar 2020 08:50:17 +0800
|
||||
|
||||
qv2ray (2.3.0-1) unstable; urgency=medium
|
||||
|
||||
* misc ui tweaks
|
||||
* fully support setting the block,proxy,direct geosite/plain domains
|
||||
* fixed vmess:// 'h2' import issue
|
||||
|
||||
-- Guobang Bi <ymshenyu@gmail.com> Fri, 20 Mar 2020 22:26:20 +0800
|
||||
|
||||
qv2ray (2.2.3-1) unstable; urgency=medium
|
||||
|
||||
* Initial release
|
||||
|
@ -1 +1 @@
|
||||
4752
|
||||
5052
|
||||
|
@ -1 +1 @@
|
||||
2.2.3
|
||||
2.3.1
|
||||
|
@ -14,10 +14,8 @@ namespace Qv2ray
|
||||
bool debugLog;
|
||||
/// Enable Network toolbar plugin.
|
||||
bool enableToolbarPlguin;
|
||||
/// Endable HiDPI support.
|
||||
bool hiDPI;
|
||||
/// Force endable HiDPI support.
|
||||
bool forceHiDPI;
|
||||
/// Disable Qt scale factors support.
|
||||
bool noScaleFactors;
|
||||
};
|
||||
} // namespace base
|
||||
inline base::QvStartupOptions StartupOption = base::QvStartupOptions();
|
||||
|
@ -8,8 +8,7 @@ namespace Qv2ray::common
|
||||
: QObject(), noAPIOption("noAPI", tr("Disable gRPC API subsystems.")), //
|
||||
runAsRootOption("I-just-wanna-run-with-root", tr("Explicitly run Qv2ray as root.")), //
|
||||
debugOption("debug", tr("Enable Debug Output")), //
|
||||
hiDpiOption("hiDPI", tr("Enable HiDPI support for Qt")), //
|
||||
forceHiDpiOption("force-hiDPI", tr("Force enable HiDPI support for Qt")), //
|
||||
noScaleFactorOption("noScaleFactor", tr("Disable manually set QT_SCALE_FACTOR")), //
|
||||
withToolbarOption("withToolbarPlugin", tr("Enable Qv2ray network toolbar plugin")), //
|
||||
//
|
||||
helpOption("FAKE"), versionOption("FAKE")
|
||||
@ -20,8 +19,7 @@ namespace Qv2ray::common
|
||||
parser.addOption(noAPIOption);
|
||||
parser.addOption(runAsRootOption);
|
||||
parser.addOption(debugOption);
|
||||
parser.addOption(hiDpiOption);
|
||||
parser.addOption(forceHiDpiOption);
|
||||
parser.addOption(noScaleFactorOption);
|
||||
parser.addOption(withToolbarOption);
|
||||
helpOption = parser.addHelpOption();
|
||||
versionOption = parser.addVersionOption();
|
||||
@ -59,16 +57,10 @@ namespace Qv2ray::common
|
||||
StartupOption.debugLog = true;
|
||||
}
|
||||
|
||||
if (parser.isSet(hiDpiOption))
|
||||
if (parser.isSet(noScaleFactorOption))
|
||||
{
|
||||
DEBUG(MODULE_INIT, "hiDPI is set.")
|
||||
StartupOption.hiDPI = true;
|
||||
}
|
||||
|
||||
if (parser.isSet(forceHiDpiOption))
|
||||
{
|
||||
DEBUG(MODULE_INIT, "forceHiDPI is set.")
|
||||
StartupOption.forceHiDPI = true;
|
||||
DEBUG(MODULE_INIT, "noScaleFactorOption is set.")
|
||||
StartupOption.noScaleFactors = true;
|
||||
}
|
||||
|
||||
if (parser.isSet(withToolbarOption))
|
||||
|
@ -27,8 +27,7 @@ namespace Qv2ray::common
|
||||
QCommandLineOption noAPIOption;
|
||||
QCommandLineOption runAsRootOption;
|
||||
QCommandLineOption debugOption;
|
||||
QCommandLineOption hiDpiOption;
|
||||
QCommandLineOption forceHiDpiOption;
|
||||
QCommandLineOption noScaleFactorOption;
|
||||
QCommandLineOption withToolbarOption;
|
||||
QCommandLineOption helpOption;
|
||||
QCommandLineOption versionOption;
|
||||
|
@ -29,25 +29,25 @@ namespace Qv2ray::common
|
||||
QString StringFromFile(const QString &filePath)
|
||||
{
|
||||
QFile f(filePath);
|
||||
return StringFromFile(&f);
|
||||
return StringFromFile(f);
|
||||
}
|
||||
|
||||
QString StringFromFile(QFile *source)
|
||||
QString StringFromFile(QFile &source)
|
||||
{
|
||||
bool wasOpened = source->isOpen();
|
||||
bool wasOpened = source.isOpen();
|
||||
if (!wasOpened)
|
||||
source->open(QFile::ReadOnly);
|
||||
auto byteArray = source->readAll();
|
||||
source.open(QFile::ReadOnly);
|
||||
auto byteArray = source.readAll();
|
||||
if (!wasOpened)
|
||||
source->close();
|
||||
source.close();
|
||||
//
|
||||
QTextCodec::ConverterState state;
|
||||
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
|
||||
const QString text = codec->toUnicode(byteArray.constData(), byteArray.size(), &state);
|
||||
if (state.invalidChars > 0)
|
||||
{
|
||||
LOG(MODULE_FILEIO, "Not a valid UTF-8 sequence: " + source->fileName())
|
||||
return source->readAll();
|
||||
LOG(MODULE_FILEIO, "Not a valid UTF-8 sequence: " + source.fileName())
|
||||
return byteArray;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -74,12 +74,6 @@ namespace Qv2ray::common
|
||||
return override;
|
||||
}
|
||||
|
||||
QJsonObject JSONFromFile(QFile *sourceFile)
|
||||
{
|
||||
QString json = StringFromFile(sourceFile);
|
||||
return JsonFromString(json);
|
||||
}
|
||||
|
||||
QString JsonToString(const QJsonObject &json, QJsonDocument::JsonFormat format)
|
||||
{
|
||||
QJsonDocument doc;
|
||||
@ -239,10 +233,14 @@ namespace Qv2ray::common
|
||||
QGraphicsBlurEffect pBlur;
|
||||
//
|
||||
view.setScene(&scene);
|
||||
view.resize(pixmap.size() / QWidget().devicePixelRatio());
|
||||
view.setSceneRect(pixmap.rect());
|
||||
scene.setSceneRect(pixmap.rect());
|
||||
pBlur.setBlurRadius(rad);
|
||||
QGraphicsPixmapItem *p = view.scene()->addPixmap(pixmap);
|
||||
p->setGraphicsEffect(&pBlur);
|
||||
view.setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
|
||||
view.setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
|
||||
return view.grab();
|
||||
}
|
||||
|
||||
@ -255,9 +253,13 @@ namespace Qv2ray::common
|
||||
pColor.setStrength(factor);
|
||||
//
|
||||
view.setScene(&scene);
|
||||
view.resize(pixmap.size() / QWidget().devicePixelRatio());
|
||||
view.setSceneRect(pixmap.rect());
|
||||
scene.setSceneRect(pixmap.rect());
|
||||
QGraphicsPixmapItem *p = view.scene()->addPixmap(pixmap);
|
||||
p->setGraphicsEffect(&pColor);
|
||||
view.setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
|
||||
view.setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
|
||||
return view.grab();
|
||||
}
|
||||
} // namespace Qv2ray::common
|
||||
|
@ -26,7 +26,7 @@ namespace Qv2ray::common
|
||||
QMessageBox::StandardButton extraButtons = QMessageBox::NoButton);
|
||||
//
|
||||
QString StringFromFile(const QString &filePath);
|
||||
QString StringFromFile(QFile *source);
|
||||
QString StringFromFile(QFile &source);
|
||||
bool StringToFile(const QString &text, QFile &target);
|
||||
bool StringToFile(const QString &text, const QString &targetpath);
|
||||
//
|
||||
@ -50,7 +50,7 @@ namespace Qv2ray::common
|
||||
}
|
||||
//
|
||||
template<typename TYPE>
|
||||
QString StructToJsonString(const TYPE t)
|
||||
QString StructToJsonString(const TYPE &t)
|
||||
{
|
||||
return QString::fromStdString(x2struct::X::tojson(t, "", 4, ' '));
|
||||
}
|
||||
@ -100,12 +100,9 @@ namespace Qv2ray::common
|
||||
|
||||
inline QString timeToString(const time_t &t)
|
||||
{
|
||||
auto _tm = std::localtime(&t);
|
||||
char MY_TIME[128];
|
||||
setlocale(1, "3");
|
||||
// using strftime to display time
|
||||
strftime(MY_TIME, sizeof(MY_TIME), "%x - %I:%M%p", _tm);
|
||||
return QString(MY_TIME);
|
||||
QDateTime timestamp;
|
||||
timestamp.setSecsSinceEpoch(t);
|
||||
return timestamp.toString(Qt::SystemLocaleShortDate);
|
||||
}
|
||||
|
||||
inline void FastAppendTextDocument(const QString &message, QTextDocument *doc)
|
||||
|
@ -6,7 +6,7 @@ namespace Qv2ray::core::connection
|
||||
{
|
||||
namespace ConnectionIO
|
||||
{
|
||||
CONFIGROOT ConvertConfigFromFile(QString sourceFilePath, bool importComplex)
|
||||
CONFIGROOT ConvertConfigFromFile(const QString &sourceFilePath, bool importComplex)
|
||||
{
|
||||
QFile source(sourceFilePath);
|
||||
|
||||
@ -15,7 +15,7 @@ namespace Qv2ray::core::connection
|
||||
LOG(MODULE_FILEIO, "Trying to import from an non-existing file.") return CONFIGROOT();
|
||||
}
|
||||
|
||||
auto root = CONFIGROOT(JsonFromString(StringFromFile(&source)));
|
||||
auto root = CONFIGROOT(JsonFromString(StringFromFile(source)));
|
||||
|
||||
if (!importComplex)
|
||||
{
|
||||
|
@ -1,12 +1,12 @@
|
||||
#pragma once
|
||||
#include "base/Qv2rayBase.hpp"
|
||||
#include "core/CoreSafeTypes.hpp"
|
||||
|
||||
namespace Qv2ray::core::connection
|
||||
{
|
||||
namespace ConnectionIO
|
||||
{
|
||||
// File Protocol
|
||||
CONFIGROOT ConvertConfigFromFile(QString sourceFilePath, bool importComplex);
|
||||
CONFIGROOT ConvertConfigFromFile(const QString &sourceFilePath, bool importComplex);
|
||||
} // namespace ConnectionIO
|
||||
} // namespace Qv2ray::core::connection
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
#pragma once
|
||||
#include "base/Qv2rayBase.hpp"
|
||||
|
||||
namespace Qv2ray::core::connection
|
||||
|
@ -1,3 +1,4 @@
|
||||
#pragma once
|
||||
#include "base/Qv2rayBase.hpp"
|
||||
#include "core/CoreSafeTypes.hpp"
|
||||
|
||||
|
@ -86,7 +86,7 @@ namespace Qv2ray::core::config
|
||||
//
|
||||
// Verify JSON file format. (only) because this file version may
|
||||
// not be upgraded and may contain unsupported structure.
|
||||
auto err = VerifyJsonString(StringFromFile(&configFile));
|
||||
auto err = VerifyJsonString(StringFromFile(configFile));
|
||||
|
||||
if (!err.isEmpty())
|
||||
{
|
||||
@ -96,7 +96,7 @@ namespace Qv2ray::core::config
|
||||
else
|
||||
{
|
||||
// If the file format is valid.
|
||||
auto conf = JsonFromString(StringFromFile(&configFile));
|
||||
auto conf = JsonFromString(StringFromFile(configFile));
|
||||
LOG(MODULE_SETTINGS,
|
||||
"Path: " + path + " contains a config file, in version " + conf["config_version"].toVariant().toString())
|
||||
configFile.close();
|
||||
|
@ -1,3 +1,4 @@
|
||||
#pragma once
|
||||
#include "base/Qv2rayBase.hpp"
|
||||
|
||||
namespace Qv2ray::core::config
|
||||
|
70
src/main.cpp
70
src/main.cpp
@ -26,6 +26,7 @@
|
||||
void signalHandler(int signum)
|
||||
{
|
||||
cout << "Qv2ray: Interrupt signal (" << signum << ") received." << endl;
|
||||
ExitQv2ray();
|
||||
qApp->exit(-99);
|
||||
}
|
||||
|
||||
@ -227,17 +228,16 @@ int main(int argc, char *argv[])
|
||||
SingleApplication::setApplicationName("qv2ray_debug");
|
||||
SingleApplication::setApplicationDisplayName("Qv2ray - " + QObject::tr("Debug version"));
|
||||
#endif
|
||||
if ((!qEnvironmentVariableIsSet("QT_DEVICE_PIXEL_RATIO") && //
|
||||
!qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") && //
|
||||
!qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && //
|
||||
!qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) || //
|
||||
StartupOption.forceHiDPI)
|
||||
if (StartupOption.noScaleFactors)
|
||||
{
|
||||
if (StartupOption.forceHiDPI || StartupOption.hiDPI)
|
||||
{
|
||||
DEBUG(MODULE_INIT, "High DPI scaling is enabled.")
|
||||
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
}
|
||||
LOG(MODULE_INIT, "Force set QT_SCALE_FACTOR to 0.")
|
||||
LOG(MODULE_UI, "Original QT_SCALE_FACTOR was: " + qEnvironmentVariable("QT_SCALE_FACTOR"))
|
||||
qputenv("QT_SCALE_FACTOR", "1");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(MODULE_INIT, "High DPI scaling is enabled.")
|
||||
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
}
|
||||
SingleApplication _qApp(argc, argv, false,
|
||||
SingleApplication::User | SingleApplication::ExcludeAppPath | SingleApplication::ExcludeAppVersion);
|
||||
@ -251,42 +251,36 @@ int main(int argc, char *argv[])
|
||||
bool _result_ = Qv2rayTranslator->InstallTranslation(_lang);
|
||||
LOG(MODULE_UI, "Installing a tranlator from OS: " + _lang + " -- " + (_result_ ? "OK" : "Failed"))
|
||||
//
|
||||
LOG("LICENCE", NEWLINE
|
||||
"This program comes with ABSOLUTELY NO WARRANTY." NEWLINE "This is free software, and you are welcome to redistribute it" NEWLINE
|
||||
"under certain conditions." NEWLINE NEWLINE "Copyright (c) 2019-2020 Qv2ray Development Group." NEWLINE NEWLINE NEWLINE
|
||||
"Libraries that have been used in Qv2ray are listed below (Sorted by date added):" NEWLINE
|
||||
"Copyright (c) 2020 dridk (@dridk): X2Struct (Apache)" NEWLINE "Copyright (c) 2011 SCHUTZ Sacha (@dridk): QJsonModel (MIT)" NEWLINE
|
||||
"Copyright (c) 2020 Nikolaos Ftylitakis (@ftylitak): QZXing (Apache2)" NEWLINE
|
||||
"Copyright (c) 2016 Singein (@Singein): ScreenShot (MIT)" NEWLINE
|
||||
"Copyright (c) 2016 Nikhil Marathe (@nikhilm): QHttpServer (MIT)" NEWLINE
|
||||
"Copyright (c) 2020 Itay Grudev (@itay-grudev): SingleApplication (MIT)" NEWLINE
|
||||
"Copyright (c) 2020 paceholder (@paceholder): nodeeditor (QNodeEditor modified by lhy0403) (BSD-3-Clause)" NEWLINE
|
||||
"Copyright (c) 2019 TheWanderingCoel (@TheWanderingCoel): ShadowClash (launchatlogin) (GPLv3)" NEWLINE
|
||||
"Copyright (c) 2020 Ram Pani (@DuckSoft): QvRPCBridge (WTFPL)" NEWLINE
|
||||
"Copyright (c) 2019 ShadowSocks (@shadowsocks): libQtShadowsocks (LGPLv3)" NEWLINE
|
||||
"Copyright (c) 2015-2020 qBittorrent (Anton Lashkov) (@qBittorrent): speedplotview (GPLv2)" NEWLINE NEWLINE)
|
||||
LOG("LICENCE", NEWLINE //
|
||||
"This program comes with ABSOLUTELY NO WARRANTY." NEWLINE //
|
||||
"This is free software, and you are welcome to redistribute it" NEWLINE //
|
||||
"under certain conditions." NEWLINE //
|
||||
NEWLINE //
|
||||
"Copyright (c) 2019-2020 Qv2ray Development Group." NEWLINE //
|
||||
NEWLINE //
|
||||
"Libraries that have been used in Qv2ray are listed below (Sorted by date added):" NEWLINE //
|
||||
"Copyright (c) 2020 dridk (@dridk): X2Struct (Apache)" NEWLINE //
|
||||
"Copyright (c) 2011 SCHUTZ Sacha (@dridk): QJsonModel (MIT)" NEWLINE //
|
||||
"Copyright (c) 2020 Nikolaos Ftylitakis (@ftylitak): QZXing (Apache2)" NEWLINE //
|
||||
"Copyright (c) 2016 Singein (@Singein): ScreenShot (MIT)" NEWLINE //
|
||||
"Copyright (c) 2016 Nikhil Marathe (@nikhilm): QHttpServer (MIT)" NEWLINE //
|
||||
"Copyright (c) 2020 Itay Grudev (@itay-grudev): SingleApplication (MIT)" NEWLINE //
|
||||
"Copyright (c) 2020 paceholder (@paceholder): nodeeditor (QNodeEditor modified by lhy0403) (BSD-3-Clause)" NEWLINE //
|
||||
"Copyright (c) 2019 TheWanderingCoel (@TheWanderingCoel): ShadowClash (launchatlogin) (GPLv3)" NEWLINE //
|
||||
"Copyright (c) 2020 Ram Pani (@DuckSoft): QvRPCBridge (WTFPL)" NEWLINE //
|
||||
"Copyright (c) 2019 ShadowSocks (@shadowsocks): libQtShadowsocks (LGPLv3)" NEWLINE //
|
||||
"Copyright (c) 2015-2020 qBittorrent (Anton Lashkov) (@qBittorrent): speedplotview (GPLv2)" NEWLINE NEWLINE) //
|
||||
//
|
||||
LOG(MODULE_INIT, "Qv2ray Start Time: " + QSTRN(QTime::currentTime().msecsSinceStartOfDay()))
|
||||
//
|
||||
#ifdef QT_DEBUG
|
||||
cout << "WARNING: ============================== This is a debug build, many features are not stable enough. =============================="
|
||||
<< endl;
|
||||
cout << "WARNING: ========================= This is a debug build, many features are not stable enough. =========================" << endl;
|
||||
#endif
|
||||
//
|
||||
// Load the language translation list.
|
||||
// auto translationDir = Qv
|
||||
|
||||
// auto translationDir = QvTranslator::deduceTranslationDir();
|
||||
// if (!translationDir)
|
||||
// {
|
||||
// LOG(MODULE_INIT, "FAILED to find any translations. THIS IS A BUILD ERROR.")
|
||||
// QvMessageBoxWarn(nullptr, QObject::tr("Cannot load languages"),
|
||||
// QObject::tr("Qv2ray will continue running, but you cannot change the UI language."));
|
||||
// }
|
||||
|
||||
// Qv2ray Initialize, find possible config paths and verify them.
|
||||
if (!initialiseQv2ray())
|
||||
{
|
||||
LOG(MODULE_INIT, "Failed to initialise Qv2ray, exiting.")
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -324,7 +318,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (Qv2rayTranslator->InstallTranslation(confObject.uiConfig.language))
|
||||
{
|
||||
LOG(MODULE_INIT, "Successfully installed a translator for " + confObject.uiConfig.language);
|
||||
LOG(MODULE_INIT, "Successfully installed a translator for " + confObject.uiConfig.language)
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -254,7 +254,7 @@ void ImportConfigWindow::on_cancelImportBtn_clicked()
|
||||
void ImportConfigWindow::on_subscriptionButton_clicked()
|
||||
{
|
||||
hide();
|
||||
SubscribeEditor w;
|
||||
SubscriptionEditor w;
|
||||
w.exec();
|
||||
auto importToComplex = !keepImportedInboundCheckBox->isEnabled();
|
||||
connections.clear();
|
||||
|
@ -211,21 +211,35 @@
|
||||
<string>Subscriptions / Manually Input</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="formLayout_4">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_16">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_14">
|
||||
<property name="text">
|
||||
<string>Manually Input Connections</string>
|
||||
<string>Subscription Link</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Subscription Manager</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="subscriptionButton">
|
||||
<property name="text">
|
||||
<string>Open Subscription Manager</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="text">
|
||||
<string>Connection Editor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<item row="5" column="1">
|
||||
<widget class="QPushButton" name="connectionEditBtn">
|
||||
<property name="text">
|
||||
<string>Open Connection Editor</string>
|
||||
@ -235,14 +249,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="label_15">
|
||||
<property name="text">
|
||||
<string>Route Editor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<item row="6" column="1">
|
||||
<widget class="QPushButton" name="routeEditBtn">
|
||||
<property name="text">
|
||||
<string>Open Route Editor</string>
|
||||
@ -252,8 +266,38 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Json Editor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<widget class="QPushButton" name="jsonEditBtn">
|
||||
<property name="text">
|
||||
<string>Open JSON Editor</string>
|
||||
</property>
|
||||
<property name="autoDefault">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>Manually Input Connections</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="Line" name="line">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@ -265,44 +309,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_14">
|
||||
<property name="text">
|
||||
<string>Subscription Link</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Subscription Manager</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QPushButton" name="subscriptionButton">
|
||||
<property name="text">
|
||||
<string>Open Subscription Manager</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Json Editor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QPushButton" name="jsonEditBtn">
|
||||
<property name="text">
|
||||
<string>Open JSON Editor</string>
|
||||
</property>
|
||||
<property name="autoDefault">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabWidgetPage1">
|
||||
@ -392,7 +398,6 @@
|
||||
<tabstop>errorsList</tabstop>
|
||||
<tabstop>connectionEditBtn</tabstop>
|
||||
<tabstop>routeEditBtn</tabstop>
|
||||
<tabstop>subscriptionButton</tabstop>
|
||||
<tabstop>beginImportBtn</tabstop>
|
||||
<tabstop>cancelImportBtn</tabstop>
|
||||
</tabstops>
|
||||
|
@ -312,7 +312,7 @@ void MainWindow::timerEvent(QTimerEvent *event)
|
||||
auto log = readLastLog().trimmed();
|
||||
if (!log.isEmpty())
|
||||
{
|
||||
FastAppendTextDocument(NEWLINE + log, qvLogDocument);
|
||||
FastAppendTextDocument(NEWLINE + log, qvLogDocument); /*end*/
|
||||
// qvLogDocument->setPlainText(qvLogDocument->toPlainText() + NEWLINE + log);
|
||||
}
|
||||
}
|
||||
@ -379,11 +379,15 @@ void MainWindow::VersionUpdate(QByteArray &data)
|
||||
{
|
||||
LOG(MODULE_UPDATE, "New version detected.")
|
||||
auto link = root["html_url"].toString("");
|
||||
auto result =
|
||||
QvMessageBoxAsk(this, tr("Update"),
|
||||
tr("Found a new version: ") + root["tag_name"].toString("") + "\r\n" + root["name"].toString("") +
|
||||
"\r\n------------\r\n" + root["body"].toString("") + "\r\n------------\r\n" + tr("Download Link: ") + link,
|
||||
QMessageBox::Ignore);
|
||||
auto result = QvMessageBoxAsk(this, tr("Update"),
|
||||
tr("Found a new version: ") + //
|
||||
root["tag_name"].toString("") + NEWLINE + //
|
||||
root["name"].toString("") + //
|
||||
NEWLINE "------------" NEWLINE + //
|
||||
root["body"].toString("") + //
|
||||
NEWLINE "------------" NEWLINE + //
|
||||
tr("Download Link: ") + link,
|
||||
QMessageBox::Ignore);
|
||||
|
||||
if (result == QMessageBox::Yes)
|
||||
{
|
||||
@ -393,7 +397,7 @@ void MainWindow::VersionUpdate(QByteArray &data)
|
||||
{
|
||||
// Set and save ingored version.
|
||||
GlobalConfig.ignoredVersion = newVersion.toString();
|
||||
// SaveGlobalConfig(GlobalConfig);
|
||||
SaveGlobalSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -567,7 +571,7 @@ void MainWindow::on_action_RCM_EditAsComplex_triggered()
|
||||
|
||||
void MainWindow::on_subsButton_clicked()
|
||||
{
|
||||
SubscribeEditor().exec();
|
||||
SubscriptionEditor().exec();
|
||||
}
|
||||
|
||||
void MainWindow::on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
|
||||
|
@ -34,6 +34,7 @@ class MainWindow
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow() override;
|
||||
static MainWindow *mwInstance;
|
||||
signals:
|
||||
void StartConnection() const;
|
||||
void StopConnection() const;
|
||||
@ -42,47 +43,29 @@ class MainWindow
|
||||
private:
|
||||
QvMessageBusSlotDecl;
|
||||
private slots:
|
||||
#ifndef DISABLE_AUTO_UPDATE
|
||||
void VersionUpdate(QByteArray &data);
|
||||
#endif
|
||||
void on_activatedTray(QSystemTrayIcon::ActivationReason reason);
|
||||
void on_actionExit_triggered();
|
||||
void on_preferencesBtn_clicked();
|
||||
void on_clearlogButton_clicked();
|
||||
void on_connectionListWidget_customContextMenuRequested(const QPoint &pos);
|
||||
void on_importConfigButton_clicked();
|
||||
void on_subsButton_clicked();
|
||||
//
|
||||
void ToggleVisibility();
|
||||
#ifndef DISABLE_AUTO_UPDATE
|
||||
void VersionUpdate(QByteArray &data);
|
||||
#endif
|
||||
void on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
|
||||
void on_connectionFilterTxt_textEdited(const QString &arg1);
|
||||
void on_connectionListWidget_itemClicked(QTreeWidgetItem *item, int column);
|
||||
void on_locateBtn_clicked();
|
||||
//
|
||||
void on_chartVisibilityBtn_clicked();
|
||||
void on_logVisibilityBtn_clicked();
|
||||
void on_clearChartBtn_clicked();
|
||||
void on_connectionListWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||
void on_masterLogBrowser_textChanged();
|
||||
|
||||
public:
|
||||
static MainWindow *mwInstance;
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *e) override;
|
||||
void keyReleaseEvent(QKeyEvent *e) override;
|
||||
void closeEvent(QCloseEvent *) override;
|
||||
|
||||
private slots:
|
||||
void OnEditRequested(const ConnectionId &id);
|
||||
void OnEditJsonRequested(const ConnectionId &id);
|
||||
//
|
||||
void OnConnectionWidgetFocusRequested(const ConnectionItemWidget *widget);
|
||||
//
|
||||
void OnConnected(const ConnectionId &id);
|
||||
void OnDisconnected(const ConnectionId &id);
|
||||
//
|
||||
void OnStatsAvailable(const ConnectionId &id, const quint64 upS, const quint64 downS, const quint64 upD, const quint64 downD);
|
||||
void OnVCoreLogAvailable(const ConnectionId &id, const QString &log);
|
||||
//
|
||||
void OnConnectionCreated(const ConnectionId &id, const QString &displayName);
|
||||
void OnConnectionDeleted(const ConnectionId &id, const GroupId &groupId);
|
||||
void OnConnectionGroupChanged(const ConnectionId &id, const GroupId &originalGroup, const GroupId &newGroup);
|
||||
//
|
||||
void OnGroupCreated(const GroupId &id, const QString &displayName);
|
||||
void OnGroupDeleted(const GroupId &id, const QList<ConnectionId> &connections);
|
||||
//
|
||||
private:
|
||||
void on_actionExit_triggered();
|
||||
void on_action_StartThis_triggered();
|
||||
void on_action_RCM_SetAutoConnection_triggered();
|
||||
void on_action_RCM_EditThis_triggered();
|
||||
@ -96,23 +79,33 @@ class MainWindow
|
||||
void on_action_RCM_tovCoreLog_triggered();
|
||||
void on_action_RCM_toQvLog_triggered();
|
||||
//
|
||||
void on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
|
||||
void on_connectionFilterTxt_textEdited(const QString &arg1);
|
||||
void on_connectionListWidget_itemClicked(QTreeWidgetItem *item, int column);
|
||||
void on_locateBtn_clicked();
|
||||
void OnConnectionWidgetFocusRequested(const ConnectionItemWidget *widget);
|
||||
//
|
||||
void ToggleVisibility();
|
||||
void OnEditRequested(const ConnectionId &id);
|
||||
void OnEditJsonRequested(const ConnectionId &id);
|
||||
void OnConnected(const ConnectionId &id);
|
||||
void OnDisconnected(const ConnectionId &id);
|
||||
//
|
||||
void OnStatsAvailable(const ConnectionId &id, const quint64 upS, const quint64 downS, const quint64 upD, const quint64 downD);
|
||||
void OnVCoreLogAvailable(const ConnectionId &id, const QString &log);
|
||||
//
|
||||
void OnConnectionCreated(const ConnectionId &id, const QString &displayName);
|
||||
void OnConnectionDeleted(const ConnectionId &id, const GroupId &groupId);
|
||||
void OnConnectionGroupChanged(const ConnectionId &id, const GroupId &originalGroup, const GroupId &newGroup);
|
||||
//
|
||||
void OnGroupCreated(const GroupId &id, const QString &displayName);
|
||||
void OnGroupDeleted(const GroupId &id, const QList<ConnectionId> &connections);
|
||||
//
|
||||
void SortConnectionList(MW_ITEM_COL byCol, bool asending);
|
||||
void on_chartVisibilityBtn_clicked();
|
||||
void on_logVisibilityBtn_clicked();
|
||||
void on_clearChartBtn_clicked();
|
||||
void on_connectionListWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||
|
||||
void on_masterLogBrowser_textChanged();
|
||||
|
||||
void on_pluginsBtn_clicked();
|
||||
|
||||
protected:
|
||||
void timerEvent(QTimerEvent *event) override;
|
||||
void keyPressEvent(QKeyEvent *e) override;
|
||||
void keyReleaseEvent(QKeyEvent *e) override;
|
||||
void closeEvent(QCloseEvent *) override;
|
||||
|
||||
private:
|
||||
QHash<GroupId, shared_ptr<QTreeWidgetItem>> groupNodes;
|
||||
|
@ -6,22 +6,19 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>880</width>
|
||||
<height>660</height>
|
||||
<width>860</width>
|
||||
<height>650</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>780</width>
|
||||
<height>530</height>
|
||||
<width>790</width>
|
||||
<height>600</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Qv2ray</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1,0">
|
||||
<item>
|
||||
@ -50,6 +47,19 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
@ -60,7 +70,7 @@
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>999999999</width>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
|
@ -211,8 +211,8 @@ PreferencesWindow::PreferencesWindow(QWidget *parent) : QDialog(parent), Current
|
||||
QSTRN(pacPortSB->value()) + "/pac");
|
||||
//
|
||||
finishedLoading = true;
|
||||
routeSettingsWidget = new RouteSettingsMatrixWidget(this);
|
||||
routeSettingsWidget->SetRouteConfig(CurrentConfig.connectionConfig.routeConfig, CurrentConfig.kernelConfig.AssetsPath());
|
||||
routeSettingsWidget = new RouteSettingsMatrixWidget(CurrentConfig.kernelConfig.AssetsPath(), this);
|
||||
routeSettingsWidget->SetRouteConfig(CurrentConfig.connectionConfig.routeConfig);
|
||||
advRouteSettingsLayout->addWidget(routeSettingsWidget);
|
||||
}
|
||||
|
||||
@ -806,7 +806,7 @@ void PreferencesWindow::on_nsBarFontSizeSB_valueChanged(double arg1)
|
||||
SET_LINE_LIST_TEXT
|
||||
}
|
||||
|
||||
QString PreferencesWindow::GetBarLineDescription(QvBarLine barLine)
|
||||
QString PreferencesWindow::GetBarLineDescription(const QvBarLine &barLine)
|
||||
{
|
||||
QString result = "Empty";
|
||||
result = NetSpeedPluginMessages[barLine.ContentType];
|
||||
|
@ -172,7 +172,7 @@ class PreferencesWindow
|
||||
void SetAutoStartButtonsState(bool isAutoStart);
|
||||
// Set ui parameters for a line;
|
||||
void ShowLineParameters(QvBarLine &line);
|
||||
QString GetBarLineDescription(QvBarLine line);
|
||||
QString GetBarLineDescription(const QvBarLine &barLine);
|
||||
//
|
||||
int CurrentBarLineId;
|
||||
int CurrentBarPageId;
|
||||
|
@ -4,10 +4,10 @@
|
||||
#include "core/handler/ConfigHandler.hpp"
|
||||
#include "core/settings/SettingsBackend.hpp"
|
||||
|
||||
SubscribeEditor::SubscribeEditor(QWidget *parent) : QDialog(parent)
|
||||
SubscriptionEditor::SubscriptionEditor(QWidget *parent) : QDialog(parent)
|
||||
{
|
||||
setupUi(this);
|
||||
QvMessageBusConnect(SubscribeEditor);
|
||||
QvMessageBusConnect(SubscriptionEditor);
|
||||
UpdateColorScheme();
|
||||
for (auto subs : ConnectionManager->Subscriptions())
|
||||
{
|
||||
@ -19,13 +19,13 @@ SubscribeEditor::SubscribeEditor(QWidget *parent) : QDialog(parent)
|
||||
}
|
||||
}
|
||||
|
||||
void SubscribeEditor::UpdateColorScheme()
|
||||
void SubscriptionEditor::UpdateColorScheme()
|
||||
{
|
||||
addSubsButton->setIcon(QICON_R("add.png"));
|
||||
removeSubsButton->setIcon(QICON_R("delete.png"));
|
||||
}
|
||||
|
||||
QvMessageBusSlotImpl(SubscribeEditor)
|
||||
QvMessageBusSlotImpl(SubscriptionEditor)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
@ -33,16 +33,16 @@ QvMessageBusSlotImpl(SubscribeEditor)
|
||||
}
|
||||
}
|
||||
|
||||
tuple<QString, CONFIGROOT> SubscribeEditor::GetSelectedConfig()
|
||||
tuple<QString, CONFIGROOT> SubscriptionEditor::GetSelectedConfig()
|
||||
{
|
||||
return { GetDisplayName(currentConnectionId), ConnectionManager->GetConnectionRoot(currentConnectionId) };
|
||||
}
|
||||
|
||||
SubscribeEditor::~SubscribeEditor()
|
||||
SubscriptionEditor::~SubscriptionEditor()
|
||||
{
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_addSubsButton_clicked()
|
||||
void SubscriptionEditor::on_addSubsButton_clicked()
|
||||
{
|
||||
auto const key = QSTRN(QTime::currentTime().msecsSinceStartOfDay());
|
||||
auto id = ConnectionManager->CreateGroup(key, true);
|
||||
@ -50,7 +50,7 @@ void SubscribeEditor::on_addSubsButton_clicked()
|
||||
subscriptionList->addTopLevelItem(new QTreeWidgetItem(QStringList{ key, id.toString() }));
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_updateButton_clicked()
|
||||
void SubscriptionEditor::on_updateButton_clicked()
|
||||
{
|
||||
if (QvMessageBoxAsk(this, tr("Reload Subscription"), tr("Would you like to reload the subscription?")) == QMessageBox::Yes)
|
||||
{
|
||||
@ -61,7 +61,7 @@ void SubscribeEditor::on_updateButton_clicked()
|
||||
}
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_removeSubsButton_clicked()
|
||||
void SubscriptionEditor::on_removeSubsButton_clicked()
|
||||
{
|
||||
if (QvMessageBoxAsk(this, tr("Deleting a subscription"), tr("All connections will be moved to default group, do you want to continue?")) ==
|
||||
QMessageBox::Yes)
|
||||
@ -82,17 +82,17 @@ void SubscribeEditor::on_removeSubsButton_clicked()
|
||||
}
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_buttonBox_accepted()
|
||||
void SubscriptionEditor::on_buttonBox_accepted()
|
||||
{
|
||||
// Nothing?
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_subscriptionList_itemSelectionChanged()
|
||||
void SubscriptionEditor::on_subscriptionList_itemSelectionChanged()
|
||||
{
|
||||
groupBox_2->setEnabled(subscriptionList->selectedItems().count() > 0);
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_subscriptionList_itemClicked(QTreeWidgetItem *item, int column)
|
||||
void SubscriptionEditor::on_subscriptionList_itemClicked(QTreeWidgetItem *item, int column)
|
||||
{
|
||||
Q_UNUSED(column)
|
||||
|
||||
@ -119,31 +119,31 @@ void SubscribeEditor::on_subscriptionList_itemClicked(QTreeWidgetItem *item, int
|
||||
}
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_subscriptionList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
|
||||
void SubscriptionEditor::on_subscriptionList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
|
||||
{
|
||||
Q_UNUSED(previous)
|
||||
on_subscriptionList_itemClicked(current, 0);
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_subNameTxt_textEdited(const QString &arg1)
|
||||
void SubscriptionEditor::on_subNameTxt_textEdited(const QString &arg1)
|
||||
{
|
||||
subscriptionList->selectedItems().first()->setText(0, arg1);
|
||||
ConnectionManager->RenameGroup(currentSubId, arg1.trimmed());
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_subAddrTxt_textEdited(const QString &arg1)
|
||||
void SubscriptionEditor::on_subAddrTxt_textEdited(const QString &arg1)
|
||||
{
|
||||
auto newUpdateInterval = updateIntervalSB->value();
|
||||
ConnectionManager->SetSubscriptionData(currentSubId, arg1, newUpdateInterval);
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_updateIntervalSB_valueChanged(double arg1)
|
||||
void SubscriptionEditor::on_updateIntervalSB_valueChanged(double arg1)
|
||||
{
|
||||
auto newAddress = subAddrTxt->text().trimmed();
|
||||
ConnectionManager->SetSubscriptionData(currentSubId, newAddress, arg1);
|
||||
}
|
||||
|
||||
void SubscribeEditor::on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
|
||||
void SubscriptionEditor::on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
|
||||
{
|
||||
Q_UNUSED(previous)
|
||||
if (current != nullptr)
|
||||
|
@ -7,15 +7,15 @@
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
class SubscribeEditor
|
||||
class SubscriptionEditor
|
||||
: public QDialog
|
||||
, private Ui::w_SubscribeEditor
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SubscribeEditor(QWidget *parent = nullptr);
|
||||
~SubscribeEditor();
|
||||
explicit SubscriptionEditor(QWidget *parent = nullptr);
|
||||
~SubscriptionEditor();
|
||||
tuple<QString, CONFIGROOT> GetSelectedConfig();
|
||||
|
||||
private:
|
||||
|
@ -84,7 +84,7 @@ void ConnectionInfoWidget::ShowDetails(const tuple<GroupId, ConnectionId> &_iden
|
||||
//
|
||||
QZXingEncoderConfig conf;
|
||||
conf.border = true;
|
||||
conf.imageSize = QSize(400, 400);
|
||||
conf.imageSize = qrLabel->size() * devicePixelRatio();
|
||||
conf.errorCorrectionLevel = QZXing::EncodeErrorCorrectionLevel_M;
|
||||
QZXing qzx;
|
||||
qrPixmap = QPixmap::fromImage(qzx.encodeData(shareLink, conf));
|
||||
|
@ -62,56 +62,23 @@
|
||||
|
||||
namespace Qv2ray::ui::widgets
|
||||
{
|
||||
AutoCompleteTextEdit::AutoCompleteTextEdit(const QString &prefix, QWidget *parent) : QTextEdit(parent)
|
||||
{
|
||||
SetPrefix(prefix);
|
||||
}
|
||||
|
||||
AutoCompleteTextEdit::~AutoCompleteTextEdit()
|
||||
{
|
||||
}
|
||||
|
||||
void AutoCompleteTextEdit::SetPrefix(const QString &prefix)
|
||||
AutoCompleteTextEdit::AutoCompleteTextEdit(const QString &prefix, const QStringList &sourceStrings, QWidget *parent) : QTextEdit(parent)
|
||||
{
|
||||
this->prefix = prefix;
|
||||
}
|
||||
|
||||
void AutoCompleteTextEdit::SetSourceStrings(QStringList sourceStrings)
|
||||
{
|
||||
auto x = new QCompleter(this);
|
||||
auto model = new QStringListModel(sourceStrings);
|
||||
x->setModel(model);
|
||||
SetCompleter(x);
|
||||
}
|
||||
|
||||
void AutoCompleteTextEdit::SetCompleter(QCompleter *completer)
|
||||
{
|
||||
if (c)
|
||||
c->disconnect(this);
|
||||
|
||||
c = completer;
|
||||
|
||||
if (!c)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
c = new QCompleter(this);
|
||||
c->setModel(new QStringListModel(sourceStrings, c));
|
||||
c->setWidget(this);
|
||||
c->setCompletionMode(QCompleter::PopupCompletion);
|
||||
c->setCaseSensitivity(Qt::CaseInsensitive);
|
||||
QObject::connect(c, QOverload<const QString &>::of(&QCompleter::activated), this, &AutoCompleteTextEdit::insertCompletion);
|
||||
}
|
||||
|
||||
QCompleter *AutoCompleteTextEdit::completer() const
|
||||
AutoCompleteTextEdit::~AutoCompleteTextEdit()
|
||||
{
|
||||
return c;
|
||||
}
|
||||
|
||||
void AutoCompleteTextEdit::insertCompletion(const QString &completion)
|
||||
{
|
||||
if (c->widget() != this)
|
||||
return;
|
||||
|
||||
QTextCursor tc = textCursor();
|
||||
int extra = completion.length() - c->completionPrefix().length();
|
||||
tc.movePosition(QTextCursor::Left);
|
||||
|
@ -62,14 +62,9 @@ namespace Qv2ray::ui::widgets
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AutoCompleteTextEdit(const QString &prefix, QWidget *parent = nullptr);
|
||||
AutoCompleteTextEdit(const QString &prefix, const QStringList &sourceStrings, QWidget *parent = nullptr);
|
||||
~AutoCompleteTextEdit();
|
||||
|
||||
void SetPrefix(const QString &prefix);
|
||||
void SetCompleter(QCompleter *c);
|
||||
void SetSourceStrings(QStringList sourceStrings);
|
||||
QCompleter *completer() const;
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *e) override;
|
||||
void focusInEvent(QFocusEvent *e) override;
|
||||
@ -81,9 +76,7 @@ namespace Qv2ray::ui::widgets
|
||||
QString lineUnderCursor() const;
|
||||
QString wordUnderCursor() const;
|
||||
|
||||
private:
|
||||
QString prefix;
|
||||
QAbstractItemModel *modelFromStringList(const QStringList &list);
|
||||
QCompleter *c = nullptr;
|
||||
};
|
||||
} // namespace Qv2ray::ui::widgets
|
||||
|
@ -3,38 +3,27 @@
|
||||
#include "common/QvHelpers.hpp"
|
||||
#include "components/geosite/QvGeositeReader.hpp"
|
||||
|
||||
RouteSettingsMatrixWidget::RouteSettingsMatrixWidget(QWidget *parent) : QWidget(parent)
|
||||
#include <QFileDialog>
|
||||
#include <QInputDialog>
|
||||
|
||||
RouteSettingsMatrixWidget::RouteSettingsMatrixWidget(const QString &assetsDirPath, QWidget *parent)
|
||||
: QWidget(parent), assetsDirPath(assetsDirPath)
|
||||
{
|
||||
setupUi(this);
|
||||
//
|
||||
directDomainTxt = new AutoCompleteTextEdit("geosite", this);
|
||||
proxyDomainTxt = new AutoCompleteTextEdit("geosite", this);
|
||||
blockDomainTxt = new AutoCompleteTextEdit("geosite", this);
|
||||
//
|
||||
directIPTxt = new AutoCompleteTextEdit("geoip", this);
|
||||
proxyIPTxt = new AutoCompleteTextEdit("geoip", this);
|
||||
blockIPTxt = new AutoCompleteTextEdit("geoip", this);
|
||||
}
|
||||
|
||||
void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig conf, const QString &assetsDirPath)
|
||||
{
|
||||
directDomainTxt->setText(conf.domains.direct.join(NEWLINE));
|
||||
proxyDomainTxt->setText(conf.domains.proxy.join(NEWLINE));
|
||||
blockDomainTxt->setText(conf.domains.block.join(NEWLINE));
|
||||
//
|
||||
blockIPTxt->setText(conf.ips.block.join(NEWLINE));
|
||||
directIPTxt->setText(conf.ips.direct.join(NEWLINE));
|
||||
proxyIPTxt->setText(conf.ips.proxy.join(NEWLINE));
|
||||
builtInSchemesMenu = new QMenu(this);
|
||||
builtInSchemesMenu->addActions(this->getBuiltInSchemes());
|
||||
builtInSchemeBtn->setMenu(builtInSchemesMenu);
|
||||
//
|
||||
auto sourceStringsDomain = ReadGeoSiteFromFile(assetsDirPath + "/geosite.dat");
|
||||
directDomainTxt->SetSourceStrings(sourceStringsDomain);
|
||||
proxyDomainTxt->SetSourceStrings(sourceStringsDomain);
|
||||
blockDomainTxt->SetSourceStrings(sourceStringsDomain);
|
||||
directDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
|
||||
proxyDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
|
||||
blockDomainTxt = new AutoCompleteTextEdit("geosite", sourceStringsDomain, this);
|
||||
//
|
||||
auto sourceStringsIP = ReadGeoSiteFromFile(assetsDirPath + "/geoip.dat");
|
||||
directIPTxt->SetSourceStrings(sourceStringsIP);
|
||||
proxyIPTxt->SetSourceStrings(sourceStringsIP);
|
||||
blockIPTxt->SetSourceStrings(sourceStringsIP);
|
||||
directIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
|
||||
proxyIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
|
||||
blockIPTxt = new AutoCompleteTextEdit("geoip", sourceStringsIP, this);
|
||||
//
|
||||
directTxtLayout->addWidget(directDomainTxt, 0, 0);
|
||||
proxyTxtLayout->addWidget(proxyDomainTxt, 0, 0);
|
||||
@ -43,6 +32,195 @@ void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig c
|
||||
directIPLayout->addWidget(directIPTxt, 0, 0);
|
||||
proxyIPLayout->addWidget(proxyIPTxt, 0, 0);
|
||||
blockIPLayout->addWidget(blockIPTxt, 0, 0);
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief RouteSettingsMatrixWidget::getBuiltInSchemes
|
||||
* @return
|
||||
*/
|
||||
QList<QAction *> RouteSettingsMatrixWidget::getBuiltInSchemes()
|
||||
{
|
||||
QList<QAction *> list;
|
||||
|
||||
Qv2ray::base::config::Qv2rayRouteConfig emptyScheme;
|
||||
list.append(this->schemeToAction(tr("empty scheme"), emptyScheme));
|
||||
|
||||
// v2rayN scheme from 2dust/v2rayCustomRoutingList
|
||||
// License: GPL3
|
||||
Qv2ray::base::config::Qv2rayRouteConfig v2rayNScheme;
|
||||
v2rayNScheme.ips.proxy = {
|
||||
"91.108.4.0/22", "91.108.8.0/22", "91.108.12.0/22", "91.108.20.0/22", "91.108.36.0/23",
|
||||
"91.108.38.0/23", "91.108.56.0/22", "149.154.160.0/20", "149.154.164.0/22", "149.154.172.0/22",
|
||||
"74.125.0.0/16", "173.194.0.0/16", "172.217.0.0/16", "216.58.200.0/24", "216.58.220.0/24",
|
||||
"91.108.56.116", "91.108.56.0/24", "109.239.140.0/24", "149.154.167.0/24", "149.154.175.0/24",
|
||||
};
|
||||
v2rayNScheme.domains.direct = {
|
||||
"domain:12306.com",
|
||||
"domain:51ym.me",
|
||||
"domain:52pojie.cn",
|
||||
"domain:8686c.com",
|
||||
"domain:abercrombie.com",
|
||||
"domain:adobesc.com",
|
||||
"domain:air-matters.com",
|
||||
"domain:air-matters.io",
|
||||
"domain:airtable.com",
|
||||
"domain:akadns.net",
|
||||
"domain:apache.org",
|
||||
"domain:api.crisp.chat",
|
||||
"domain:api.termius.com",
|
||||
"domain:appshike.com",
|
||||
"domain:appstore.com",
|
||||
"domain:aweme.snssdk.com",
|
||||
"domain:bababian.com",
|
||||
"domain:battle.net",
|
||||
"domain:beatsbydre.com",
|
||||
"domain:bet365.com",
|
||||
"domain:bilibili.cn",
|
||||
"domain:ccgslb.com",
|
||||
"domain:ccgslb.net",
|
||||
"domain:chunbo.com",
|
||||
"domain:chunboimg.com",
|
||||
"domain:clashroyaleapp.com",
|
||||
"domain:cloudsigma.com",
|
||||
"domain:cloudxns.net",
|
||||
"domain:cmfu.com",
|
||||
"domain:culturedcode.com",
|
||||
"domain:dct-cloud.com",
|
||||
"domain:didialift.com",
|
||||
"domain:douyutv.com",
|
||||
"domain:duokan.com",
|
||||
"domain:dytt8.net",
|
||||
"domain:easou.com",
|
||||
"domain:ecitic.net",
|
||||
"domain:eclipse.org",
|
||||
"domain:eudic.net",
|
||||
"domain:ewqcxz.com",
|
||||
"domain:fir.im",
|
||||
"domain:frdic.com",
|
||||
"domain:fresh-ideas.cc",
|
||||
"domain:godic.net",
|
||||
"domain:goodread.com",
|
||||
"domain:haibian.com",
|
||||
"domain:hdslb.net",
|
||||
"domain:hollisterco.com",
|
||||
"domain:hongxiu.com",
|
||||
"domain:hxcdn.net",
|
||||
"domain:images.unsplash.com",
|
||||
"domain:img4me.com",
|
||||
"domain:ipify.org",
|
||||
"domain:ixdzs.com",
|
||||
"domain:jd.hk",
|
||||
"domain:jianshuapi.com",
|
||||
"domain:jomodns.com",
|
||||
"domain:jsboxbbs.com",
|
||||
"domain:knewone.com",
|
||||
"domain:kuaidi100.com",
|
||||
"domain:lemicp.com",
|
||||
"domain:letvcloud.com",
|
||||
"domain:lizhi.io",
|
||||
"domain:localizecdn.com",
|
||||
"domain:lucifr.com",
|
||||
"domain:luoo.net",
|
||||
"domain:mai.tn",
|
||||
"domain:maven.org",
|
||||
"domain:miwifi.com",
|
||||
"domain:moji.com",
|
||||
"domain:moke.com",
|
||||
"domain:mtalk.google.com",
|
||||
"domain:mxhichina.com",
|
||||
"domain:myqcloud.com",
|
||||
"domain:myunlu.com",
|
||||
"domain:netease.com",
|
||||
"domain:nfoservers.com",
|
||||
"domain:nssurge.com",
|
||||
"domain:nuomi.com",
|
||||
"domain:ourdvs.com",
|
||||
"domain:overcast.fm",
|
||||
"domain:paypal.com",
|
||||
"domain:paypalobjects.com",
|
||||
"domain:pgyer.com",
|
||||
"domain:qdaily.com",
|
||||
"domain:qdmm.com",
|
||||
"domain:qin.io",
|
||||
"domain:qingmang.me",
|
||||
"domain:qingmang.mobi",
|
||||
"domain:qqurl.com",
|
||||
"domain:rarbg.to",
|
||||
"domain:rrmj.tv",
|
||||
"domain:ruguoapp.com",
|
||||
"domain:sm.ms",
|
||||
"domain:snwx.com",
|
||||
"domain:soku.com",
|
||||
"domain:startssl.com",
|
||||
"domain:store.steampowered.com",
|
||||
"domain:symcd.com",
|
||||
"domain:teamviewer.com",
|
||||
"domain:tmzvps.com",
|
||||
"domain:trello.com",
|
||||
"domain:trellocdn.com",
|
||||
"domain:ttmeiju.com",
|
||||
"domain:udache.com",
|
||||
"domain:uxengine.net",
|
||||
"domain:weather.bjango.com",
|
||||
"domain:weather.com",
|
||||
"domain:webqxs.com",
|
||||
"domain:weico.cc",
|
||||
"domain:wenku8.net",
|
||||
"domain:werewolf.53site.com",
|
||||
"domain:windowsupdate.com",
|
||||
"domain:wkcdn.com",
|
||||
"domain:workflowy.com",
|
||||
"domain:xdrig.com",
|
||||
"domain:xiaojukeji.com",
|
||||
"domain:xiaomi.net",
|
||||
"domain:xiaomicp.com",
|
||||
"domain:ximalaya.com",
|
||||
"domain:xitek.com",
|
||||
"domain:xmcdn.com",
|
||||
"domain:xslb.net",
|
||||
"domain:xteko.com",
|
||||
"domain:yach.me",
|
||||
"domain:yixia.com",
|
||||
"domain:yunjiasu-cdn.net",
|
||||
"domain:zealer.com",
|
||||
"domain:zgslb.net",
|
||||
"domain:zimuzu.tv",
|
||||
"domain:zmz002.com",
|
||||
"domain:samsungdm.com",
|
||||
};
|
||||
|
||||
v2rayNScheme.domains.proxy = {
|
||||
"geosite:google", "geosite:github", "geosite:netflix", "geosite:steam", "geosite:telegram",
|
||||
"geosite:tumblr", "geosite:speedtest", "geosite:bbc", "domain:gvt1.com", "domain:textnow.com",
|
||||
"domain:twitch.tv", "domain:wikileaks.org", "domain:naver.com",
|
||||
};
|
||||
|
||||
v2rayNScheme.domains.block = {
|
||||
"geosite:category-ads-all",
|
||||
};
|
||||
|
||||
list.append(this->schemeToAction(tr("v2rayN preset"), v2rayNScheme));
|
||||
return list;
|
||||
}
|
||||
|
||||
QAction *RouteSettingsMatrixWidget::schemeToAction(const QString &name, Qv2ray::base::config::Qv2rayRouteConfig scheme)
|
||||
{
|
||||
QAction *action = new QAction();
|
||||
action->setText(name);
|
||||
connect(action, &QAction::triggered, [=] { this->SetRouteConfig(scheme); });
|
||||
return action;
|
||||
}
|
||||
|
||||
void RouteSettingsMatrixWidget::SetRouteConfig(const config::Qv2rayRouteConfig &conf)
|
||||
{
|
||||
directDomainTxt->setText(conf.domains.direct.join(NEWLINE));
|
||||
proxyDomainTxt->setText(conf.domains.proxy.join(NEWLINE));
|
||||
blockDomainTxt->setText(conf.domains.block.join(NEWLINE));
|
||||
//
|
||||
blockIPTxt->setText(conf.ips.block.join(NEWLINE));
|
||||
directIPTxt->setText(conf.ips.direct.join(NEWLINE));
|
||||
proxyIPTxt->setText(conf.ips.proxy.join(NEWLINE));
|
||||
}
|
||||
|
||||
config::Qv2rayRouteConfig RouteSettingsMatrixWidget::GetRouteConfig() const
|
||||
@ -61,3 +239,164 @@ config::Qv2rayRouteConfig RouteSettingsMatrixWidget::GetRouteConfig() const
|
||||
RouteSettingsMatrixWidget::~RouteSettingsMatrixWidget()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief The Qv2rayRouteScheme struct
|
||||
* @author DuckSoft <realducksoft@gmail.com>
|
||||
*/
|
||||
struct Qv2rayRouteScheme : config::Qv2rayRouteConfig
|
||||
{
|
||||
/**
|
||||
* @brief the name of the scheme.
|
||||
* @example "Untitled Scheme"
|
||||
*/
|
||||
QString name;
|
||||
/**
|
||||
* @brief the author of the scheme.
|
||||
* @example "DuckSoft <realducksoft@gmail.com>"
|
||||
*/
|
||||
QString author;
|
||||
/**
|
||||
* @brief details of this scheme.
|
||||
* @example "A scheme to bypass China mainland, while allowing bilibili to go through proxy."
|
||||
*/
|
||||
QString description;
|
||||
|
||||
// M: all these fields are mandatory
|
||||
XTOSTRUCT(M(name, author, description, domains, ips));
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief RouteSettingsMatrixWidget::on_importSchemeBtn_clicked
|
||||
* @author DuckSoft <realducksoft@gmail.com>
|
||||
* @todo add some debug output
|
||||
*/
|
||||
void RouteSettingsMatrixWidget::on_importSchemeBtn_clicked()
|
||||
{
|
||||
try
|
||||
{
|
||||
// open up the file dialog and choose a file.
|
||||
auto filePath = this->openFileDialog();
|
||||
if (!filePath)
|
||||
return;
|
||||
|
||||
// read the file and parse back to struct.
|
||||
// if error occurred on parsing, an exception will be thrown.
|
||||
auto content = StringFromFile(filePath.value());
|
||||
auto scheme = StructFromJsonString<Qv2rayRouteScheme>(content);
|
||||
|
||||
// show the information of this scheme to user,
|
||||
// and ask user if he/she wants to import and apply this.
|
||||
auto strPrompt = tr("Import scheme '%1' by '%2'?" NEWLINE "Description: %3").arg(scheme.name, scheme.author, scheme.description);
|
||||
auto decision = QvMessageBoxAsk(this, tr("Importing Scheme"), strPrompt);
|
||||
|
||||
// if user don't want to import, just leave.
|
||||
if (decision != QMessageBox::Yes)
|
||||
return;
|
||||
|
||||
// write the scheme onto the window
|
||||
this->SetRouteConfig(static_cast<Qv2rayRouteConfig>(scheme));
|
||||
|
||||
// done
|
||||
LOG(MODULE_SETTINGS, "Imported route config: " + scheme.name + " by: " + scheme.author)
|
||||
}
|
||||
catch (exception e)
|
||||
{
|
||||
LOG(MODULE_UI, "Exception: " + QString(e.what()))
|
||||
// TODO: Give some error as Notification
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief RouteSettingsMatrixWidget::on_exportSchemeBtn_clicked
|
||||
* @author DuckSoft <realducksoft@gmail.com>
|
||||
*/
|
||||
void RouteSettingsMatrixWidget::on_exportSchemeBtn_clicked()
|
||||
{
|
||||
try
|
||||
{
|
||||
// parse the config back from the window components
|
||||
auto config = this->GetRouteConfig();
|
||||
|
||||
// init some constants
|
||||
const auto dialogTitle = tr("Exporting Scheme");
|
||||
|
||||
// scheme name?
|
||||
bool ok = false;
|
||||
auto schemeName = QInputDialog::getText(this, dialogTitle, tr("Scheme name:"), QLineEdit::Normal, tr("Unnamed Scheme"), &ok);
|
||||
if (!ok)
|
||||
return;
|
||||
|
||||
// scheme author?
|
||||
auto schemeAuthor = QInputDialog::getText(this, dialogTitle, tr("Author:"), QLineEdit::Normal, "Anonymous <mystery@example.com>", &ok);
|
||||
if (!ok)
|
||||
return;
|
||||
|
||||
// scheme description?
|
||||
auto schemeDescription =
|
||||
QInputDialog::getText(this, dialogTitle, tr("Description:"), QLineEdit::Normal, tr("The author is too lazy to leave a comment"));
|
||||
if (!ok)
|
||||
return;
|
||||
|
||||
// where to save?
|
||||
auto savePath = this->saveFileDialog();
|
||||
if (!savePath)
|
||||
return;
|
||||
|
||||
// construct the data structure
|
||||
Qv2rayRouteScheme scheme;
|
||||
scheme.name = schemeName;
|
||||
scheme.author = schemeAuthor;
|
||||
scheme.description = schemeDescription;
|
||||
scheme.ips = config.ips;
|
||||
scheme.domains = config.domains;
|
||||
|
||||
// serialize and write out
|
||||
auto content = StructToJsonString(scheme);
|
||||
StringToFile(content, savePath.value());
|
||||
|
||||
// done
|
||||
// TODO: Give some success as Notification
|
||||
}
|
||||
catch (exception)
|
||||
{
|
||||
|
||||
// TODO: Give some error as Notification
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief opens a save dialog and asks user to specify the save path.
|
||||
* @return the selected file path, if any
|
||||
* @author DuckSoft <realducksoft@gmail.com>
|
||||
*/
|
||||
std::optional<QString> RouteSettingsMatrixWidget::saveFileDialog()
|
||||
{
|
||||
QFileDialog dialog;
|
||||
dialog.setFileMode(QFileDialog::AnyFile);
|
||||
dialog.setOption(QFileDialog::Option::DontConfirmOverwrite, !true);
|
||||
dialog.setNameFilter(tr("QvRoute Schemes(*.json)"));
|
||||
dialog.setAcceptMode(QFileDialog::AcceptMode::AcceptSave);
|
||||
if (!dialog.exec() || dialog.selectedFiles().length() != 1)
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
return dialog.selectedFiles().first();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief opens up a dialog and asks user to choose a scheme file.
|
||||
* @return the selected file path, if any
|
||||
* @author DuckSoft <realducksoft@gmail.com>
|
||||
*/
|
||||
std::optional<QString> RouteSettingsMatrixWidget::openFileDialog()
|
||||
{
|
||||
QFileDialog dialog;
|
||||
dialog.setFileMode(QFileDialog::ExistingFile);
|
||||
dialog.setNameFilter(tr("QvRoute Schemes(*.json)"));
|
||||
if (!dialog.exec() || dialog.selectedFiles().length() != 1)
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
return dialog.selectedFiles().first();
|
||||
}
|
||||
|
@ -3,7 +3,9 @@
|
||||
#include "base/models/QvSettingsObject.hpp"
|
||||
#include "ui_RouteSettingsMatrix.h"
|
||||
|
||||
#include <QMenu>
|
||||
#include <QWidget>
|
||||
#include <optional>
|
||||
|
||||
class RouteSettingsMatrixWidget
|
||||
: public QWidget
|
||||
@ -12,11 +14,27 @@ class RouteSettingsMatrixWidget
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RouteSettingsMatrixWidget(QWidget *parent = nullptr);
|
||||
void SetRouteConfig(const Qv2ray::base::config::Qv2rayRouteConfig conf, const QString &assetsDirPath);
|
||||
RouteSettingsMatrixWidget(const QString &assetsDirPath, QWidget *parent = nullptr);
|
||||
void SetRouteConfig(const Qv2ray::base::config::Qv2rayRouteConfig &conf);
|
||||
Qv2ray::base::config::Qv2rayRouteConfig GetRouteConfig() const;
|
||||
~RouteSettingsMatrixWidget();
|
||||
|
||||
private:
|
||||
std::optional<QString> openFileDialog();
|
||||
std::optional<QString> saveFileDialog();
|
||||
QList<QAction *> getBuiltInSchemes();
|
||||
QAction *schemeToAction(const QString &name, Qv2ray::base::config::Qv2rayRouteConfig scheme);
|
||||
|
||||
private:
|
||||
QMenu *builtInSchemesMenu;
|
||||
|
||||
private slots:
|
||||
void on_importSchemeBtn_clicked();
|
||||
void on_exportSchemeBtn_clicked();
|
||||
|
||||
private:
|
||||
const QString &assetsDirPath;
|
||||
|
||||
private:
|
||||
Qv2ray::ui::widgets::AutoCompleteTextEdit *directDomainTxt;
|
||||
Qv2ray::ui::widgets::AutoCompleteTextEdit *proxyDomainTxt;
|
||||
|
@ -2,6 +2,14 @@
|
||||
<ui version="4.0">
|
||||
<class>RouteSettingsMatrix</class>
|
||||
<widget class="QWidget" name="RouteSettingsMatrix">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>927</width>
|
||||
<height>198</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
@ -14,7 +22,45 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1" columnstretch="0,1,1,1">
|
||||
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1" columnstretch="0,1,1,1,0">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>IP</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Domain</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QGridLayout" name="directIPLayout"/>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<layout class="QGridLayout" name="directTxtLayout"/>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<layout class="QGridLayout" name="proxyIPLayout"/>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<layout class="QGridLayout" name="proxyTxtLayout"/>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<layout class="QGridLayout" name="blockIPLayout"/>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<layout class="QGridLayout" name="blockTxtLayout"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_80">
|
||||
<property name="text">
|
||||
@ -45,52 +91,27 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Domain</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QGridLayout" name="directTxtLayout"/>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<layout class="QGridLayout" name="proxyTxtLayout"/>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<layout class="QGridLayout" name="blockTxtLayout"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>IP</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<layout class="QGridLayout" name="directIPLayout"/>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<layout class="QGridLayout" name="proxyIPLayout"/>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<layout class="QGridLayout" name="blockIPLayout"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QToolButton" name="toolButton_3">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="builtInSchemeBtn">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::CustomContextMenu</enum>
|
||||
@ -99,7 +120,7 @@
|
||||
<string>Use built-in route schemes</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Built-in Schemes</string>
|
||||
<string>Built-in Schemes...</string>
|
||||
</property>
|
||||
<property name="popupMode">
|
||||
<enum>QToolButton::InstantPopup</enum>
|
||||
@ -108,40 +129,33 @@
|
||||
<enum>Qt::ToolButtonTextBesideIcon</enum>
|
||||
</property>
|
||||
<property name="arrowType">
|
||||
<enum>Qt::DownArrow</enum>
|
||||
<enum>Qt::NoArrow</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="importSchemeBtn">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Import route scheme from file</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Import Scheme</string>
|
||||
<string>Import Scheme...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="exportSchemeBtn">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Export route scheme to file</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Export Scheme</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Coming soon!</string>
|
||||
<string>Export Scheme...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -305,42 +305,42 @@
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
|
||||
<source>Select file to import</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Capture QRCode</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Cannot find a valid QRCode from this region.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Import config file</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Failed to check the validity of the config file.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
|
||||
<source>Select an image to import</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>QRCode scanning failed</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>Cannot find any QRCode from the image.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
@ -1216,11 +1216,11 @@
|
||||
<name>PreferencesWindow</name>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>Preferences</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@ -1606,13 +1606,13 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
|
||||
<source>Bold</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
|
||||
<source>Italic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@ -1737,13 +1737,13 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
|
||||
<source>Enable tProxy Support</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
|
||||
<source>to this path: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@ -1753,115 +1753,115 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<source>Duplicated port numbers detected, please check the port number settings.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<source>Invalid inbound listening address.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
|
||||
<source>Open V2ray assets folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
|
||||
<source>Open V2ray core file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
|
||||
<source>This will append capabilities to the V2ray executable.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
|
||||
<source>Qv2ray will copy your V2ray core to this path: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
|
||||
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
|
||||
<source>Qv2ray cannot copy one or both V2ray files from: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>tProxy is not supported on macOS and Windows</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
|
||||
<source>Apply network toolbar settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
|
||||
<source>All other modified settings will be applied as well after this object.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
|
||||
<source>Do you want to continue?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
|
||||
<source>Select GFWList in base64</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Download GFWList</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<source>Operation is cancelled.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Successfully downloaded GFWList.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Start with boot</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Failed to set auto start option.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
|
||||
<source>V2ray Core Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>V2ray path configuration check passed.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>Current version of V2ray is: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@ -2056,7 +2056,7 @@ p, li { white-space: pre-wrap; }
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="111"/>
|
||||
<location filename="../src/main.cpp" line="134"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<location filename="../src/main.cpp" line="304"/>
|
||||
<source>Qv2ray will now exit.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
@ -2071,57 +2071,57 @@ p, li { white-space: pre-wrap; }
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="203"/>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<location filename="../src/main.cpp" line="205"/>
|
||||
<source> --> USE IT AT YOUR OWN RISK!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="226"/>
|
||||
<location filename="../src/main.cpp" line="227"/>
|
||||
<source>Debug version</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="299"/>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<source>Qv2ray Cannot Continue</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<source>Please check if there's an issue explaining about it.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<source>Or submit a new issue if you think this is an error.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="346"/>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<source>Dependency Missing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<source>This could be caused by a missing of `openssl` package in your system.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<source>If you are using an AppImage from Github Action, please report a bug.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<source>Cannot find openssl libs</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
@ -2141,7 +2141,7 @@ p, li { white-space: pre-wrap; }
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<location filename="../src/main.cpp" line="351"/>
|
||||
<source>Technical Details</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
@ -2164,25 +2164,25 @@ p, li { white-space: pre-wrap; }
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
|
||||
<source>Deprecated</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
|
||||
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
|
||||
<source>It will be removed or be provided as a plugin in the future.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
|
||||
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@ -3015,21 +3015,11 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Use built-in route schemes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Built-in Schemes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import route scheme from file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export route scheme to file</source>
|
||||
@ -3037,12 +3027,76 @@ p, li { white-space: pre-wrap; }
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme</source>
|
||||
<source>Built-in Schemes...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Coming soon!</source>
|
||||
<source>Import Scheme...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RouteSettingsMatrixWidget</name>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
|
||||
<source>empty scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
|
||||
<source>v2rayN preset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
|
||||
<source>Import scheme '%1' by '%2'?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
|
||||
<source>Importing Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
|
||||
<source>Exporting Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Scheme name:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Unnamed Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
|
||||
<source>Author:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>Description:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>The author is too lazy to leave a comment</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
|
||||
<source>QvRoute Schemes(*.json)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
@ -3243,22 +3297,22 @@ p, li { white-space: pre-wrap; }
|
||||
<context>
|
||||
<name>SubscribeEditor</name>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Reload Subscription</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Would you like to reload the subscription?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>Deleting a subscription</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>All connections will be moved to default group, do you want to continue?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -415,42 +415,42 @@
|
||||
<translation>取り消し</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
|
||||
<source>Select file to import</source>
|
||||
<translation>インポートするファイルを選択</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Capture QRCode</source>
|
||||
<translation>QRCodeをキャプチャ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Cannot find a valid QRCode from this region.</source>
|
||||
<translation>この地域から有効なQRコードが見つかりません。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Import config file</source>
|
||||
<translation>設定ファイルをインポートする</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Failed to check the validity of the config file.</source>
|
||||
<translation>構成ファイルの有効性を確認できませんでした。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
|
||||
<source>Select an image to import</source>
|
||||
<translation>インポートする画像を選択してください</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>QRCode scanning failed</source>
|
||||
<translation>QRコードのスキャンに失敗しました</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>Cannot find any QRCode from the image.</source>
|
||||
<translation>画像からQRコードが見つかりません。</translation>
|
||||
</message>
|
||||
@ -1619,11 +1619,11 @@
|
||||
<name>PreferencesWindow</name>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>Preferences</source>
|
||||
<translation>設定</translation>
|
||||
</message>
|
||||
@ -2093,13 +2093,13 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
|
||||
<source>Bold</source>
|
||||
<translation>Bold</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
|
||||
<source>Italic</source>
|
||||
<translation>斜体</translation>
|
||||
</message>
|
||||
@ -2224,13 +2224,13 @@
|
||||
<translation>アイテム</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
|
||||
<source>Enable tProxy Support</source>
|
||||
<translation>tProxyサポートを有効にする</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
|
||||
<source>to this path: </source>
|
||||
<translation>このパスへ: </translation>
|
||||
</message>
|
||||
@ -2240,68 +2240,68 @@
|
||||
<translation>Qv2rayネットワークツールバーは無効になっており、まだテスト中です。 --withToolbarPluginを追加して有効にします。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<source>Duplicated port numbers detected, please check the port number settings.</source>
|
||||
<translation>重複したポート番号が検出されました。ポート番号の設定を確認してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<source>Invalid inbound listening address.</source>
|
||||
<translation>無効なインバウンドリスニングアドレス。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
|
||||
<source>Open V2ray assets folder</source>
|
||||
<translation>V2rayアセットフォルダーを開く</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
|
||||
<source>Open V2ray core file</source>
|
||||
<translation>V2rayコアファイルを開く</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
|
||||
<source>This will append capabilities to the V2ray executable.</source>
|
||||
<translation>これにより、V2ray実行可能ファイルに機能が追加されます。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
|
||||
<source>Qv2ray will copy your V2ray core to this path: </source>
|
||||
<translation>Qv2rayは、V2rayコアを次のパスにコピーします: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
|
||||
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
|
||||
<translation>これを有効にした後に何か問題が発生した場合は、問題#57または以下のリンクを確認してください:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
|
||||
<source>Qv2ray cannot copy one or both V2ray files from: </source>
|
||||
<translation>Qv2rayは、V2rayファイルの一方または両方を以下からコピーできません: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
|
||||
<translation>V2ray実行可能ファイルへのsetcapに失敗しました。`setcap`を手動で実行する必要がある場合があります。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>tProxy is not supported on macOS and Windows</source>
|
||||
<translation>tProxyはmacOSおよびWindowsではサポートされていません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
|
||||
<source>Apply network toolbar settings</source>
|
||||
<translation>ネットワークツールバー設定を適用する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
|
||||
<source>All other modified settings will be applied as well after this object.</source>
|
||||
<translation>All other modified settings will be applied as well after this object.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
|
||||
<source>Do you want to continue?</source>
|
||||
<translation>続けますか?</translation>
|
||||
</message>
|
||||
@ -2314,49 +2314,49 @@
|
||||
<translation type="vanished">Please restart Qv2ray to fully apply this feature.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
|
||||
<source>Select GFWList in base64</source>
|
||||
<translation>Base64でGFWListを選択します</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Download GFWList</source>
|
||||
<translation>GFWListをダウンロードする</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<source>Operation is cancelled.</source>
|
||||
<translation>操作はキャンセルされます。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Successfully downloaded GFWList.</source>
|
||||
<translation>GFWListを正常にダウンロードしました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Start with boot</source>
|
||||
<translation>ブート時に起動します</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Failed to set auto start option.</source>
|
||||
<translation>自動開始オプションの設定に失敗しました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
|
||||
<source>V2ray Core Settings</source>
|
||||
<translation>V2ray Core設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>V2ray path configuration check passed.</source>
|
||||
<translation>V2rayパス構成チェックに合格しました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>Current version of V2ray is: </source>
|
||||
<translation>V2rayの現在のバージョンは次のとおりです: </translation>
|
||||
</message>
|
||||
@ -2487,7 +2487,7 @@ p, li { white-space: pre-wrap; }
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="111"/>
|
||||
<location filename="../src/main.cpp" line="134"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<location filename="../src/main.cpp" line="304"/>
|
||||
<source>Qv2ray will now exit.</source>
|
||||
<translation>Qv2rayは終了します。</translation>
|
||||
</message>
|
||||
@ -2506,12 +2506,12 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>バグだと思われる場合は報告してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="203"/>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
|
||||
<translation>Qv2rayをルートとして実行することはできません。本当に実行したい場合は、--I-just-wanna-run-with-rootを使用してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<location filename="../src/main.cpp" line="205"/>
|
||||
<source> --> USE IT AT YOUR OWN RISK!</source>
|
||||
<translation> --> 自分の責任で使用してください!</translation>
|
||||
</message>
|
||||
@ -2524,42 +2524,42 @@ p, li { white-space: pre-wrap; }
|
||||
<translation type="vanished">Qv2ray will continue running, but you cannot change the UI language.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="299"/>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<source>Qv2ray Cannot Continue</source>
|
||||
<translation>Qv2rayを続行できません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
|
||||
<translation>現在の構成ファイルと比較して、より低いバージョンのQv2rayを実行しています。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<source>Please check if there's an issue explaining about it.</source>
|
||||
<translation>それについて説明する問題があるかどうかを確認してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<source>Or submit a new issue if you think this is an error.</source>
|
||||
<translation>または、これがエラーだと思われる場合は、新しい問題を送信してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="346"/>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<source>Dependency Missing</source>
|
||||
<translation>依存関係がありません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<source>This could be caused by a missing of `openssl` package in your system.</source>
|
||||
<translation>これは、システムに `openssl`パッケージが存在しないことが原因である可能性があります。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<source>If you are using an AppImage from Github Action, please report a bug.</source>
|
||||
<translation>Github ActionsのAppImageを使用している場合は、バグを報告してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<source>Cannot find openssl libs</source>
|
||||
<translation>OpenSSLライブラリが見つかりません</translation>
|
||||
</message>
|
||||
@ -2579,12 +2579,12 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>回避策は、このファイルを削除してQv2rayを再起動することです:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="226"/>
|
||||
<location filename="../src/main.cpp" line="227"/>
|
||||
<source>Debug version</source>
|
||||
<translation>デバッグバージョン</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<location filename="../src/main.cpp" line="351"/>
|
||||
<source>Technical Details</source>
|
||||
<translation>技術的な詳細</translation>
|
||||
</message>
|
||||
@ -2803,25 +2803,25 @@ p, li { white-space: pre-wrap; }
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
|
||||
<source>Deprecated</source>
|
||||
<translation>非推奨</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
|
||||
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
|
||||
<translation>PACは非推奨になり、使用を推奨されなくなりました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
|
||||
<source>It will be removed or be provided as a plugin in the future.</source>
|
||||
<translation>今後削除されるか、プラグインとして提供されます。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
|
||||
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
|
||||
<translation>PACは現在も機能しますが、できるだけ早くV2Rayの組み込みルーティングに切り替えてください。</translation>
|
||||
</message>
|
||||
@ -3515,9 +3515,8 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>組み込みのルートスキームを使用する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Built-in Schemes</source>
|
||||
<translation>組み込みスキーム</translation>
|
||||
<translation type="vanished">組み込みスキーム</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
@ -3525,9 +3524,8 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>ファイルからルートスキームをインポートする</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import Scheme</source>
|
||||
<translation>スキームをインポート</translation>
|
||||
<translation type="vanished">スキームをインポート</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
@ -3535,14 +3533,86 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>ルートスキームをファイルにエクスポート</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme</source>
|
||||
<translation>スキームをエクスポート</translation>
|
||||
<translation type="vanished">スキームをエクスポート</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Coming soon!</source>
|
||||
<translation type="vanished">近日公開!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Coming soon!</source>
|
||||
<translation>近日公開!</translation>
|
||||
<source>Built-in Schemes...</source>
|
||||
<translation>組み込みスキーム...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import Scheme...</source>
|
||||
<translation>スキームをインポート...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme...</source>
|
||||
<translation>スキームをエクスポート...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RouteSettingsMatrixWidget</name>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
|
||||
<source>empty scheme</source>
|
||||
<translation>空策略</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
|
||||
<source>v2rayN preset</source>
|
||||
<translation>v2rayN 策略</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
|
||||
<source>Import scheme '%1' by '%2'?</source>
|
||||
<translation>「%2」によるスキーム「%1」をインポートしますか?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
|
||||
<source>Importing Scheme</source>
|
||||
<translation>スキームをインポート</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
|
||||
<source>Exporting Scheme</source>
|
||||
<translation>スキームをエクスポート</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Scheme name:</source>
|
||||
<translation>スキーム名:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Unnamed Scheme</source>
|
||||
<translation>無名スキーム</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
|
||||
<source>Author:</source>
|
||||
<translation>著者:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>Description:</source>
|
||||
<translation>説明:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>The author is too lazy to leave a comment</source>
|
||||
<translation>著者はコメントを残すのが面倒です</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
|
||||
<source>QvRoute Schemes(*.json)</source>
|
||||
<translation>QvRouteスキーム(* .json)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3782,22 +3852,22 @@ p, li { white-space: pre-wrap; }
|
||||
<translation type="vanished">Failed to process the result from the upstream, please check your Url.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Reload Subscription</source>
|
||||
<translation>サブスクリプションを更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Would you like to reload the subscription?</source>
|
||||
<translation>サブスクリプションを更新しますか?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>Deleting a subscription</source>
|
||||
<translation>サブスクリプションを削除する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>All connections will be moved to default group, do you want to continue?</source>
|
||||
<translation>すべての接続がデフォルトグループに移動します。続行しますか?</translation>
|
||||
</message>
|
||||
|
@ -399,42 +399,42 @@
|
||||
<translation>Отмена</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
|
||||
<source>Select file to import</source>
|
||||
<translation>Выберите файл для Импорта</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Capture QRCode</source>
|
||||
<translation>Захват QRCode</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Cannot find a valid QRCode from this region.</source>
|
||||
<translation>Не удается найти QRCode из этой области.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Import config file</source>
|
||||
<translation>Выберите файл конфигурации</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Failed to check the validity of the config file.</source>
|
||||
<translation>Не удалось проверить правильность файла конфигурации.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
|
||||
<source>Select an image to import</source>
|
||||
<translation>Выберите изображение для импорта</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>QRCode scanning failed</source>
|
||||
<translation>Ошибка сканирования QRCode</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>Cannot find any QRCode from the image.</source>
|
||||
<translation>Не удается найти QRCode в изображении.</translation>
|
||||
</message>
|
||||
@ -1603,11 +1603,11 @@
|
||||
<name>PreferencesWindow</name>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>Preferences</source>
|
||||
<translation>Настройки</translation>
|
||||
</message>
|
||||
@ -2077,13 +2077,13 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
|
||||
<source>Bold</source>
|
||||
<translation>Жирный</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
|
||||
<source>Italic</source>
|
||||
<translation>Курсив</translation>
|
||||
</message>
|
||||
@ -2208,13 +2208,13 @@
|
||||
<translation>Объекты</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
|
||||
<source>Enable tProxy Support</source>
|
||||
<translation>Включить tProxy поддержку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
|
||||
<source>to this path: </source>
|
||||
<translation>на этот путь: </translation>
|
||||
</message>
|
||||
@ -2224,68 +2224,68 @@
|
||||
<translation>Панель инструментов сети Qv2ray отключена и все еще тестируется. Добавьте --withToolbarPlugin для включения.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<source>Duplicated port numbers detected, please check the port number settings.</source>
|
||||
<translation>Обнаружены дублированные номера портов, проверьте настройки номера порта.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<source>Invalid inbound listening address.</source>
|
||||
<translation>Неверный входящий адрес прослушивания.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
|
||||
<source>Open V2ray assets folder</source>
|
||||
<translation>Откройте папку активов v2ray</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
|
||||
<source>Open V2ray core file</source>
|
||||
<translation>Открыть основной файл V2ray</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
|
||||
<source>This will append capabilities to the V2ray executable.</source>
|
||||
<translation>Это добавит возможности к исполняемому файлу V2ray.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
|
||||
<source>Qv2ray will copy your V2ray core to this path: </source>
|
||||
<translation>Qv2ray скопирует ваше ядро V2ray по этому пути:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
|
||||
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
|
||||
<translation>Если после включения этого параметра что-то пойдет не так, проверьте проблему № 57 или ссылку ниже:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
|
||||
<source>Qv2ray cannot copy one or both V2ray files from: </source>
|
||||
<translation>Qv2ray не может скопировать один или оба файла V2ray из:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
|
||||
<translation>Не удалось установить setcap на исполняемый файл V2ray. Возможно, вам придется запустить `setcap` вручную.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>tProxy is not supported on macOS and Windows</source>
|
||||
<translation>tProxy не поддерживается на macOS и Windows</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
|
||||
<source>Apply network toolbar settings</source>
|
||||
<translation>Применить настройки панели инструментов сети</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
|
||||
<source>All other modified settings will be applied as well after this object.</source>
|
||||
<translation>Все остальные измененные настройки будут применены и после этого объекта.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
|
||||
<source>Do you want to continue?</source>
|
||||
<translation>Вы хотите продолжить?</translation>
|
||||
</message>
|
||||
@ -2298,49 +2298,49 @@
|
||||
<translation type="vanished">Пожалуйста, перезапустите Qv2ray, чтобы полностью применить эту функцию.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
|
||||
<source>Select GFWList in base64</source>
|
||||
<translation>Выберите GFWList в base64</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Download GFWList</source>
|
||||
<translation>Скачать GFWList</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<source>Operation is cancelled.</source>
|
||||
<translation>Операция отменена.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Successfully downloaded GFWList.</source>
|
||||
<translation>Успешно загружено %1$s.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Start with boot</source>
|
||||
<translation>Автозапуск</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Failed to set auto start option.</source>
|
||||
<translation>Не удалось установить опцию автозапуска.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
|
||||
<source>V2ray Core Settings</source>
|
||||
<translation>Настройки ядра V2ray</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>V2ray path configuration check passed.</source>
|
||||
<translation>Проверка конфигурации пути V2ray пройдена.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>Current version of V2ray is: </source>
|
||||
<translation>Текущая версия V2ray:</translation>
|
||||
</message>
|
||||
@ -2459,7 +2459,7 @@ p, li { white-space: pre-wrap; }
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="111"/>
|
||||
<location filename="../src/main.cpp" line="134"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<location filename="../src/main.cpp" line="304"/>
|
||||
<source>Qv2ray will now exit.</source>
|
||||
<translation>Qv2ray теперь выйдет.</translation>
|
||||
</message>
|
||||
@ -2478,12 +2478,12 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>Пожалуйста, сообщите, если вы считаете об этом, если это ошибка.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="203"/>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
|
||||
<translation>Вы не можете запустить Qv2ray как root, пожалуйста, используйте --I-just-wanna-run-with-root, если вы хотите это сделать.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<location filename="../src/main.cpp" line="205"/>
|
||||
<source> --> USE IT AT YOUR OWN RISK!</source>
|
||||
<translation> --> ИСПОЛЬЗУЙТЕ ЕГО НА СВОЙ СТРАХ И РИСК!</translation>
|
||||
</message>
|
||||
@ -2496,42 +2496,42 @@ p, li { white-space: pre-wrap; }
|
||||
<translation type="vanished">Qv2ray продолжит работу, но вы не сможете изменить язык интерфейса.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="299"/>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<source>Qv2ray Cannot Continue</source>
|
||||
<translation>Qv2ray не может продолжить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
|
||||
<translation>Вы используете более низкую версию Qv2ray по сравнению с текущим файлом конфигурации.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<source>Please check if there's an issue explaining about it.</source>
|
||||
<translation>Пожалуйста, проверьте, есть ли проблема с объяснением этого.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<source>Or submit a new issue if you think this is an error.</source>
|
||||
<translation>Или отправьте новую проблему, если вы считаете, что это ошибка.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="346"/>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<source>Dependency Missing</source>
|
||||
<translation>Зависимость отсутствует</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<source>This could be caused by a missing of `openssl` package in your system.</source>
|
||||
<translation>Это может быть вызвано отсутствием пакета `openssl` в вашей системе.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<source>If you are using an AppImage from Github Action, please report a bug.</source>
|
||||
<translation>Если вы используете AppImage из Github Action, пожалуйста, сообщите об ошибке.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<source>Cannot find openssl libs</source>
|
||||
<translation>Не удается найти openssl libs</translation>
|
||||
</message>
|
||||
@ -2551,12 +2551,12 @@ p, li { white-space: pre-wrap; }
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="226"/>
|
||||
<location filename="../src/main.cpp" line="227"/>
|
||||
<source>Debug version</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<location filename="../src/main.cpp" line="351"/>
|
||||
<source>Technical Details</source>
|
||||
<translation>Технические детали</translation>
|
||||
</message>
|
||||
@ -2775,25 +2775,25 @@ p, li { white-space: pre-wrap; }
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
|
||||
<source>Deprecated</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
|
||||
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
|
||||
<source>It will be removed or be provided as a plugin in the future.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
|
||||
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@ -3486,21 +3486,11 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Use built-in route schemes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Built-in Schemes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import route scheme from file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export route scheme to file</source>
|
||||
@ -3508,12 +3498,76 @@ p, li { white-space: pre-wrap; }
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme</source>
|
||||
<source>Built-in Schemes...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Coming soon!</source>
|
||||
<source>Import Scheme...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RouteSettingsMatrixWidget</name>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
|
||||
<source>empty scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
|
||||
<source>v2rayN preset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
|
||||
<source>Import scheme '%1' by '%2'?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
|
||||
<source>Importing Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
|
||||
<source>Exporting Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Scheme name:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Unnamed Scheme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
|
||||
<source>Author:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>Description:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>The author is too lazy to leave a comment</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
|
||||
<source>QvRoute Schemes(*.json)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
@ -3754,22 +3808,22 @@ p, li { white-space: pre-wrap; }
|
||||
<translation type="vanished">Не удалось обработать результат из апстрима, проверьте ваш URL.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Reload Subscription</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Would you like to reload the subscription?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>Deleting a subscription</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>All connections will be moved to default group, do you want to continue?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -320,42 +320,42 @@
|
||||
<translation>取消</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="60"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="61"/>
|
||||
<source>Select file to import</source>
|
||||
<translation>选择要导入的文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Capture QRCode</source>
|
||||
<translation>抓取二维码</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="93"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="94"/>
|
||||
<source>Cannot find a valid QRCode from this region.</source>
|
||||
<translation>无法从这个区域找到有效的二维码。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Import config file</source>
|
||||
<translation>导入配置文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="166"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="167"/>
|
||||
<source>Failed to check the validity of the config file.</source>
|
||||
<translation>检查配置文件有效性时失败。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="181"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="182"/>
|
||||
<source>Select an image to import</source>
|
||||
<translation>选择要导入的图像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>QRCode scanning failed</source>
|
||||
<translation>二维码扫描失败</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="195"/>
|
||||
<location filename="../src/ui/w_ImportConfig.cpp" line="196"/>
|
||||
<source>Cannot find any QRCode from the image.</source>
|
||||
<translation>无法从图像中找到任何二维码。</translation>
|
||||
</message>
|
||||
@ -1257,11 +1257,11 @@
|
||||
<name>PreferencesWindow</name>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>Preferences</source>
|
||||
<translation>首选项</translation>
|
||||
</message>
|
||||
@ -1651,13 +1651,13 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="819"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="813"/>
|
||||
<source>Bold</source>
|
||||
<translation>粗体</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.ui"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="820"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="814"/>
|
||||
<source>Italic</source>
|
||||
<translation>斜体</translation>
|
||||
</message>
|
||||
@ -1782,13 +1782,13 @@
|
||||
<translation>项目</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="471"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="531"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="465"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="525"/>
|
||||
<source>Enable tProxy Support</source>
|
||||
<translation>启用 tProxy 支持</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="533"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="527"/>
|
||||
<source>to this path: </source>
|
||||
<translation>到此路径: </translation>
|
||||
</message>
|
||||
@ -1798,115 +1798,115 @@
|
||||
<translation>Qv2ray 的网络工具栏已被禁用,请使用 --withToolbarPlugin 来启用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="268"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="262"/>
|
||||
<source>Duplicated port numbers detected, please check the port number settings.</source>
|
||||
<translation>检测到重复的端口号,请检查端口号设置。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="272"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="266"/>
|
||||
<source>Invalid inbound listening address.</source>
|
||||
<translation>入站监听地址不可用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="390"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="384"/>
|
||||
<source>Open V2ray assets folder</source>
|
||||
<translation>打开 V2ray 资源文件夹</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="401"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="395"/>
|
||||
<source>Open V2ray core file</source>
|
||||
<translation>打开 V2ray 核心文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="472"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="466"/>
|
||||
<source>This will append capabilities to the V2ray executable.</source>
|
||||
<translation>这会将功能附加到 V2ray 可执行文件。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="473"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="467"/>
|
||||
<source>Qv2ray will copy your V2ray core to this path: </source>
|
||||
<translation>Qv2ray 会将您的 V2ray 核心复制到以下路径: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="474"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="468"/>
|
||||
<source>If anything goes wrong after enabling this, please check issue #57 or the link below:</source>
|
||||
<translation>如果有出现任何问题,请参阅 Issue #57 或以下链接:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="532"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="526"/>
|
||||
<source>Qv2ray cannot copy one or both V2ray files from: </source>
|
||||
<translation>Qv2ray 无法从以下位置复制一个或两个 V2ray 文件: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="549"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="563"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="543"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="557"/>
|
||||
<source>Failed to setcap onto V2ray executable. You may need to run `setcap` manually.</source>
|
||||
<translation>无法将 Capcap 设置到 V2ray 可执行文件上。 您可能需要手动运行“ setcap”。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="573"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="567"/>
|
||||
<source>tProxy is not supported on macOS and Windows</source>
|
||||
<translation>在 macOS 和 Windows 上不支持 tProxy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="883"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="877"/>
|
||||
<source>Apply network toolbar settings</source>
|
||||
<translation>应用网络工具栏设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="884"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="878"/>
|
||||
<source>All other modified settings will be applied as well after this object.</source>
|
||||
<translation>已经编辑的其它设置也会被同时应用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="885"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="879"/>
|
||||
<source>Do you want to continue?</source>
|
||||
<translation>你想继续吗?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="965"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="959"/>
|
||||
<source>Select GFWList in base64</source>
|
||||
<translation>选择 base64 格式的 GFWList</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Download GFWList</source>
|
||||
<translation>下载 GFWList</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="969"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="963"/>
|
||||
<source>Operation is cancelled.</source>
|
||||
<translation>操作已经取消</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="978"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="972"/>
|
||||
<source>Successfully downloaded GFWList.</source>
|
||||
<translation>下载 GFWList 成功。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Start with boot</source>
|
||||
<translation>开机启动</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1072"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1063"/>
|
||||
<source>Failed to set auto start option.</source>
|
||||
<translation>无法设置自动启动选项。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1161"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1165"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1152"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1156"/>
|
||||
<source>V2ray Core Settings</source>
|
||||
<translation>V2ray 核心设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>V2ray path configuration check passed.</source>
|
||||
<translation>V2ray 路径配置检查通过。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1166"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1157"/>
|
||||
<source>Current version of V2ray is: </source>
|
||||
<translation>V2ray 当前版本是: </translation>
|
||||
</message>
|
||||
@ -2113,7 +2113,7 @@ p, li { white-space: pre-wrap; }
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="111"/>
|
||||
<location filename="../src/main.cpp" line="134"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<location filename="../src/main.cpp" line="304"/>
|
||||
<source>Qv2ray will now exit.</source>
|
||||
<translation>Qv2ray 现在将退出。</translation>
|
||||
</message>
|
||||
@ -2128,57 +2128,57 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>如果您认为它是一个bug,请'报告。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="203"/>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<source>You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so.</source>
|
||||
<translation>您不能以root用户身份运行Qv2ray,如果您确实想这样做,请使用 --I-just-wanna-run-with-root。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="204"/>
|
||||
<location filename="../src/main.cpp" line="205"/>
|
||||
<source> --> USE IT AT YOUR OWN RISK!</source>
|
||||
<translation> --> 请自负风险!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="226"/>
|
||||
<location filename="../src/main.cpp" line="227"/>
|
||||
<source>Debug version</source>
|
||||
<translation>调试版</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="299"/>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<source>Qv2ray Cannot Continue</source>
|
||||
<translation>Qv2ray 无法继续</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="300"/>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<source>You are running a lower version of Qv2ray compared to the current config file.</source>
|
||||
<translation>与当前配置文件相比,您正在运行一个较低版本的 Qv2ray。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="301"/>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<source>Please check if there's an issue explaining about it.</source>
|
||||
<translation>请检查是否存在'有关此问题的说明。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="302"/>
|
||||
<location filename="../src/main.cpp" line="303"/>
|
||||
<source>Or submit a new issue if you think this is an error.</source>
|
||||
<translation>或者如果你认为这是一个错误,请提交一个新问题。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="346"/>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<source>Dependency Missing</source>
|
||||
<translation>缺少依赖关系</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<source>This could be caused by a missing of `openssl` package in your system.</source>
|
||||
<translation>这可能是系统中缺少`openssl`软件包造成的。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="349"/>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<source>If you are using an AppImage from Github Action, please report a bug.</source>
|
||||
<translation>如果您使用的是来自 Github Action 的 AppImage,请报告错误。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="347"/>
|
||||
<location filename="../src/main.cpp" line="348"/>
|
||||
<source>Cannot find openssl libs</source>
|
||||
<translation>找不到 OpenSSL 库</translation>
|
||||
</message>
|
||||
@ -2198,7 +2198,7 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>一种解决方法是删除此文件并重新启动Qv2ray:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="350"/>
|
||||
<location filename="../src/main.cpp" line="351"/>
|
||||
<source>Technical Details</source>
|
||||
<translation>技术细节</translation>
|
||||
</message>
|
||||
@ -2237,25 +2237,25 @@ p, li { white-space: pre-wrap; }
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="277"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1192"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1183"/>
|
||||
<source>Deprecated</source>
|
||||
<translation>已经过时</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="278"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1193"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1184"/>
|
||||
<source>PAC is now deprecated and is not encouraged to be used anymore.</source>
|
||||
<translation>PAC 已经被标记为过时的功能,并且我们不建议您继续使用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="279"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1194"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1185"/>
|
||||
<source>It will be removed or be provided as a plugin in the future.</source>
|
||||
<translation>它可能会在将来某个版本被移除,或者作为单独的插件提供。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/core/settings/SettingsUpgrade.cpp" line="280"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1195"/>
|
||||
<location filename="../src/ui/w_PreferencesWindow.cpp" line="1186"/>
|
||||
<source>PAC will still work currently, but please switch to the V2ray built-in routing as soon as possible.</source>
|
||||
<translation>PAC 目前将会继续工作,但是我们强烈建议您切换使用 V2ray 自带的路由功能。</translation>
|
||||
</message>
|
||||
@ -3089,9 +3089,8 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>使用预置路由方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Built-in Schemes</source>
|
||||
<translation>预置方案</translation>
|
||||
<translation type="vanished">预置方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
@ -3099,9 +3098,8 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>从文件导入路由方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import Scheme</source>
|
||||
<translation>导入方案</translation>
|
||||
<translation type="vanished">导入方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
@ -3109,14 +3107,86 @@ p, li { white-space: pre-wrap; }
|
||||
<translation>导出方案到文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme</source>
|
||||
<translation>导出方案</translation>
|
||||
<translation type="vanished">导出方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Coming soon!</source>
|
||||
<translation type="vanished">即将推出!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Coming soon!</source>
|
||||
<translation>即将推出!</translation>
|
||||
<source>Built-in Schemes...</source>
|
||||
<translation>预置方案...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Import Scheme...</source>
|
||||
<translation>导入方案...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.ui"/>
|
||||
<source>Export Scheme...</source>
|
||||
<translation>导出方案...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RouteSettingsMatrixWidget</name>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="47"/>
|
||||
<source>empty scheme</source>
|
||||
<translation>空白方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="203"/>
|
||||
<source>v2rayN preset</source>
|
||||
<translation>v2rayN 方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="290"/>
|
||||
<source>Import scheme '%1' by '%2'?</source>
|
||||
<translation>要导入 '%2' 的方案 '%1' 吗?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="291"/>
|
||||
<source>Importing Scheme</source>
|
||||
<translation>导入方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="322"/>
|
||||
<source>Exporting Scheme</source>
|
||||
<translation>导出方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Scheme name:</source>
|
||||
<translation>方案名称:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="326"/>
|
||||
<source>Unnamed Scheme</source>
|
||||
<translation>无名方案</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="331"/>
|
||||
<source>Author:</source>
|
||||
<translation>作者:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>Description:</source>
|
||||
<translation>描述:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="337"/>
|
||||
<source>The author is too lazy to leave a comment</source>
|
||||
<translation>作者太懒,没有写描述</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="378"/>
|
||||
<location filename="../src/ui/widgets/RouteSettingsMatrix.cpp" line="396"/>
|
||||
<source>QvRoute Schemes(*.json)</source>
|
||||
<translation>QvRoute 方案(*.json)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3320,22 +3390,22 @@ p, li { white-space: pre-wrap; }
|
||||
<context>
|
||||
<name>SubscribeEditor</name>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Reload Subscription</source>
|
||||
<translation>更新订阅</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="55"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="54"/>
|
||||
<source>Would you like to reload the subscription?</source>
|
||||
<translation>您要更新此订阅吗?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>Deleting a subscription</source>
|
||||
<translation>删除订阅</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="66"/>
|
||||
<location filename="../src/ui/w_SubscriptionManager.cpp" line="65"/>
|
||||
<source>All connections will be moved to default group, do you want to continue?</source>
|
||||
<translation>本订阅中的所有连接都将移动到默认分组,您确定要继续吗?</translation>
|
||||
</message>
|
||||
|
Loading…
Reference in New Issue
Block a user