[Linux Release] v0.9.9a

Former-commit-id: 7cc07dd680
This commit is contained in:
Leroy.H.Y 2019-07-09 20:07:14 +08:00
parent c51eef6dcc
commit 2fb44b3b33
13 changed files with 739 additions and 560 deletions

View File

@ -30,7 +30,7 @@ namespace Qv2ray
};
struct ApiObject {
string tag;
string tag = "api";
list<string> services;
ApiObject() : tag(), services() {}
XTOSTRUCT(O(tag, services))
@ -70,32 +70,32 @@ namespace Qv2ray
namespace TRANSFERObjectsInternal
{
struct HTTPRequestObject {
string version = "1.1";
string method = "GET";
string version ;
string method ;
list<string> path;
map<string, list<string>> headers;
HTTPRequestObject(): version(), method(), path(), headers() {}
HTTPRequestObject(): version("1.1"), method("GET"), path(), headers() {}
XTOSTRUCT(O(version, method, path, headers))
};
struct HTTPResponseObject {
string version = "1.1";
string status = "200";
string reason = "OK";
string version;
string status ;
string reason ;
map<string, list<string>> headers;
HTTPResponseObject(): version(), status(), reason(), headers() {}
HTTPResponseObject(): version("1.1"), status("200"), reason("OK"), headers() {}
XTOSTRUCT(O(version, status, reason, headers))
};
struct TCPHeader_M_Object {
string type;
HTTPRequestObject request;
HTTPResponseObject response;
TCPHeader_M_Object(): type(), request(), response() {}
TCPHeader_M_Object(): type("none"), request(), response() {}
XTOSTRUCT(O(type, request, response))
};
struct HeaderObject {
string type;
HeaderObject(): type() {}
HeaderObject(): type("none") {}
XTOSTRUCT(O(type))
};
}
@ -125,20 +125,20 @@ namespace Qv2ray
struct WebSocketObject {
string path;
map<string, string> headers;
WebSocketObject(): path(), headers() {}
WebSocketObject(): path("/"), headers() {}
XTOSTRUCT(O(path, headers))
};
struct HttpObject {
list<string> host;
string path;
HttpObject() : host(), path() {}
HttpObject() : host(), path("/") {}
XTOSTRUCT(O(host, path))
};
struct DomainSocketObject {
string path;
DomainSocketObject(): path() {}
DomainSocketObject(): path("/") {}
XTOSTRUCT(O(path))
};
@ -146,7 +146,7 @@ namespace Qv2ray
string security;
string key;
TRANSFERObjectsInternal::HeaderObject header;
QuicObject(): security(), key(), header() {}
QuicObject(): security(""), key(""), header() {}
XTOSTRUCT(O(security, key, header))
};
}
@ -154,7 +154,7 @@ namespace Qv2ray
namespace INBOUNDObjects
{
struct SniffingObject {
bool enabled;
bool enabled = false;
list<string> destOverride;
SniffingObject(): enabled(), destOverride() {}
XTOSTRUCT(O(enabled, destOverride))
@ -167,7 +167,7 @@ namespace Qv2ray
int mark;
bool tcpFastOpen;
string tproxy;
SockoptObject(): mark(), tcpFastOpen(), tproxy() {}
SockoptObject(): mark(0), tcpFastOpen(), tproxy("off") {}
XTOSTRUCT(O(mark, tcpFastOpen, tproxy))
};
@ -203,7 +203,7 @@ namespace Qv2ray
_TransferSettingObjects::HttpObject httpSettings;
_TransferSettingObjects::DomainSocketObject dsSettings;
_TransferSettingObjects::QuicObject quicSettings;
StreamSettingsObject(): network(), security(), sockopt(), tlsSettings(), tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {}
StreamSettingsObject(): network("tcp"), security(), sockopt(), tlsSettings(), tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {}
XTOSTRUCT(O(network, security, sockopt, tcpSettings, tlsSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings))
};
@ -214,7 +214,6 @@ namespace Qv2ray
XTOSTRUCT(O(enabled, concurrency))
};
struct RootObject {
ApiObject api;
PolicyObject policy;
@ -222,8 +221,6 @@ namespace Qv2ray
XTOSTRUCT(O(api, policy))
};
//
//
//
/// Some protocols from: https://v2ray.com/chapter_02/02_protocols.html
namespace Protocols
{
@ -278,6 +275,7 @@ namespace Qv2ray
int alterId;
string security;
int level;
UserObject() : id(), alterId(64), security("auto"), level(0) {}
XTOSTRUCT(O(id, alterId, security, level))
};
// OUTBound;

View File

@ -11,7 +11,6 @@
#define QV2RAY_MAIN_CONFIG_FILE_PATH (QV2RAY_CONFIG_PATH + "Qv2ray.conf")
#define QV2RAY_GENERATED_CONFIG_DIRPATH (QV2RAY_CONFIG_PATH + "genrerated/")
#define QV2RAY_GENERATED_CONFIG_FILE_PATH (QV2RAY_GENERATED_CONFIG_DIRPATH + "config.gen.json")
#define QV2RAY_FIRSTRUN_IDENTIFIER (QV2RAY_CONFIG_PATH + ".initialised")
#define QV2RAY_VCORE_LOG_DIRNAME "logs/"
#define QV2RAY_VCORE_ACCESS_LOG_FILENAME "access.log"
@ -22,6 +21,17 @@ using namespace std;
#define QV2RAY_CONNECTION_FILE_EXTENSION ".qv2ray.json"
// GUI TOOLS
#define RED(obj) \
auto p = ui->obj->palette(); \
p.setColor(QPalette::Text, Qt::red); \
ui->obj->setPalette(p);
#define WHITE(obj) \
auto p = ui->obj->palette(); \
p.setColor(QPalette::Text, Qt::black); \
ui->obj->setPalette(p);
namespace Qv2ray
{
namespace QvConfigModels

View File

@ -57,7 +57,7 @@ bool initializeQv()
}
}
if (!Utils::CheckFile(ConfigDir, ".initialised")) {
if (!QFile(QV2RAY_MAIN_CONFIG_FILE_PATH).exists()) {
// This is first run!
//
// These below genenrated very basic global config.
@ -68,11 +68,6 @@ bool initializeQv()
SetGlobalConfig(conf);
SaveGlobalConfig();
//
// Create Placeholder for initialise indicator.
QFile initPlaceHolder(QV2RAY_FIRSTRUN_IDENTIFIER);
initPlaceHolder.open(QFile::WriteOnly);
initPlaceHolder.close();
//
LOG("Created initial default config file.")
} else {
LoadGlobalConfig();

View File

@ -4,17 +4,6 @@
#include <QFile>
#include <QIntValidator>
#include <iostream>
#define RED(obj) \
auto p = ui->obj->palette(); \
p.setColor(QPalette::Text, Qt::red); \
ui->obj->setPalette(p);
#define WHITE(obj) \
auto p = ui->obj->palette(); \
p.setColor(QPalette::Text, Qt::black); \
ui->obj->setPalette(p);
ConnectionEditWindow::ConnectionEditWindow(QWidget *parent)
: QDialog(parent),
_alias(),
@ -25,6 +14,8 @@ ConnectionEditWindow::ConnectionEditWindow(QWidget *parent)
ui->setupUi(this);
ui->portLineEdit->setValidator(new QIntValidator());
ui->alterLineEdit->setValidator(new QIntValidator());
//
LoadGUIContents();
}
ConnectionEditWindow::ConnectionEditWindow(QJsonObject editRootObject, QString alias, QWidget *parent)
@ -126,6 +117,17 @@ void ConnectionEditWindow::on_buttonBox_accepted()
void ConnectionEditWindow::on_ipLineEdit_textEdited(const QString &arg1)
{
vmess.address = arg1.toStdString();
//
// No thanks.
//if (ui->httpHostTxt->toPlainText() == "") {
// ui->httpHostTxt->setPlainText(arg1);
// on_httpHostTxt_textChanged();
//}
//
//if (ui->wsHeadersTxt->toPlainText() == "") {
// ui->wsHeadersTxt->setPlainText("Host|" + arg1);
// on_wsHeadersTxt_textChanged();
//}
}
void ConnectionEditWindow::on_portLineEdit_textEdited(const QString &arg1)
@ -137,19 +139,22 @@ void ConnectionEditWindow::on_portLineEdit_textEdited(const QString &arg1)
void ConnectionEditWindow::on_idLineEdit_textEdited(const QString &arg1)
{
LOG("BUGFUL!")
if (vmess.users.size() == 0) vmess.users.push_back(VMessOut::ServerObject::UserObject());
vmess.users.front().id = arg1.toStdString();
}
void ConnectionEditWindow::on_alterLineEdit_textEdited(const QString &arg1)
{
LOG("BUGFUL!")
vmess.users.front().id = arg1.toStdString();
if (vmess.users.size() == 0) vmess.users.push_back(VMessOut::ServerObject::UserObject());
vmess.users.front().alterId = stoi(arg1.toStdString());
}
void ConnectionEditWindow::on_securityCombo_currentIndexChanged(const QString &arg1)
{
LOG("BUGFUL!")
if (vmess.users.size() == 0) vmess.users.push_back(VMessOut::ServerObject::UserObject());
vmess.users.front().security = arg1.toStdString();
}
@ -158,11 +163,6 @@ void ConnectionEditWindow::on_tranportCombo_currentIndexChanged(const QString &a
stream.network = arg1.toStdString();
}
void ConnectionEditWindow::on_comboBox_currentIndexChanged(const QString &arg1)
{
stream.tcpSettings.header.type = arg1.toStdString();
}
void ConnectionEditWindow::on_httpPathTxt_textEdited(const QString &arg1)
{
stream.httpSettings.path = arg1.toStdString();
@ -184,11 +184,6 @@ void ConnectionEditWindow::on_httpHostTxt_textChanged()
}
}
void ConnectionEditWindow::on_lineEdit_textEdited(const QString &arg1)
{
stream.wsSettings.path = arg1.toStdString();
}
void ConnectionEditWindow::on_wsHeadersTxt_textChanged()
{
try {
@ -209,28 +204,24 @@ void ConnectionEditWindow::on_wsHeadersTxt_textChanged()
}
}
void ConnectionEditWindow::on_spinBox_valueChanged(int arg1)
{
stream.kcpSettings.mtu = arg1;
}
void ConnectionEditWindow::on_tcpRequestDefBtn_clicked()
{
ui->tcpRequestTxt->clear();
ui->tcpRequestTxt->insertPlainText("{ \"version\" : \"TODO....\"");
ui->tcpRequestTxt->insertPlainText("{\"version\":\"1.1\",\"method\":\"GET\",\"path\":[\"/\"],\"headers\":{\"Host\":[\"www.baidu.com\",\"www.bing.com\"],\"User-Agent\":[\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\",\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46\"],\"Accept-Encoding\":[\"gzip, deflate\"],\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}");
}
void ConnectionEditWindow::on_tcpRespDefBtn_clicked()
{
ui->tcpRespTxt->clear();
ui->tcpRespTxt->insertPlainText("{ \"version\" : \"TODO....\"");
ui->tcpRespTxt->insertPlainText("{\"version\":\"1.1\",\"status\":\"200\",\"reason\":\"OK\",\"headers\":{\"Content-Type\":[\"application/octet-stream\",\"video/mpeg\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}");
}
void ConnectionEditWindow::on_tcpRequestTxt_textChanged()
{
try {
auto httpReqObject = StructFromJSONString<_TransferSettingObjects::TRANSFERObjectsInternal::HTTPRequestObject>(ui->tcpRequestTxt->toPlainText());
stream.tcpSettings.header.request = httpReqObject;
auto tcpReqObject = StructFromJSONString<_TransferSettingObjects::TRANSFERObjectsInternal::HTTPRequestObject>(ui->tcpRequestTxt->toPlainText());
stream.tcpSettings.header.request = tcpReqObject;
WHITE(tcpRequestTxt)
} catch (...) {
RED(tcpRequestTxt)
@ -240,8 +231,8 @@ void ConnectionEditWindow::on_tcpRequestTxt_textChanged()
void ConnectionEditWindow::on_tcpRespTxt_textChanged()
{
try {
auto httpRspObject = StructFromJSONString<_TransferSettingObjects::TRANSFERObjectsInternal::HTTPResponseObject>(ui->tcpRespTxt->toPlainText());
stream.tcpSettings.header.response = httpRspObject;
auto tcpRspObject = StructFromJSONString<_TransferSettingObjects::TRANSFERObjectsInternal::HTTPResponseObject>(ui->tcpRespTxt->toPlainText());
stream.tcpSettings.header.response = tcpRspObject;
WHITE(tcpRespTxt)
} catch (...) {
RED(tcpRespTxt)
@ -289,7 +280,7 @@ void ConnectionEditWindow::on_tProxyCB_currentIndexChanged(const QString &arg1)
void ConnectionEditWindow::on_quicSecurityCB_currentTextChanged(const QString &arg1)
{
stream.quicSettings.header.type = arg1.toStdString();
stream.quicSettings.security = arg1.toStdString();
}
void ConnectionEditWindow::on_quicKeyTxt_textEdited(const QString &arg1)
@ -301,3 +292,76 @@ void ConnectionEditWindow::on_quicHeaderTypeCB_currentIndexChanged(const QString
{
stream.quicSettings.header.type = arg1.toStdString();
}
void ConnectionEditWindow::on_tcpRequestPrettifyBtn_clicked()
{
try {
auto tcpReqObject = StructFromJSONString<_TransferSettingObjects::TRANSFERObjectsInternal::HTTPRequestObject>(ui->tcpRequestTxt->toPlainText());
auto tcpReqObjectStr = StructToJSONString(tcpReqObject);
ui->tcpRequestTxt->setPlainText(tcpReqObjectStr);
} catch (...) {
QvMessageBox(this, tr("#JsonPrettify"), tr("#JsonContainsError"));
}
}
void ConnectionEditWindow::on_tcpRespPrettifyBtn_clicked()
{
try {
auto tcpRspObject = StructFromJSONString<_TransferSettingObjects::TRANSFERObjectsInternal::HTTPResponseObject>(ui->tcpRespTxt->toPlainText());
auto tcpRspObjectStr = StructToJSONString(tcpRspObject);
ui->tcpRespTxt->setPlainText(tcpRspObjectStr);
} catch (...) {
QvMessageBox(this, tr("#JsonPrettify"), tr("#JsonContainsError"));
}
}
void ConnectionEditWindow::on_tcpHeaderTypeCB_currentIndexChanged(const QString &arg1)
{
stream.tcpSettings.header.type = arg1.toStdString();
}
void ConnectionEditWindow::on_wsPathTxt_textEdited(const QString &arg1)
{
stream.wsSettings.path = arg1.toStdString();
}
void ConnectionEditWindow::on_kcpMTU_valueChanged(int arg1)
{
stream.kcpSettings.mtu = arg1;
}
void ConnectionEditWindow::on_kcpTTI_valueChanged(int arg1)
{
stream.kcpSettings.tti = arg1;
}
void ConnectionEditWindow::on_kcpUploadCapacSB_valueChanged(int arg1)
{
stream.kcpSettings.uplinkCapacity = arg1;
}
void ConnectionEditWindow::on_kcpCongestionCB_stateChanged(int arg1)
{
stream.kcpSettings.congestion = arg1 == Qt::Checked;
}
void ConnectionEditWindow::on_kcpDownCapacitySB_valueChanged(int arg1)
{
stream.kcpSettings.downlinkCapacity = arg1;
}
void ConnectionEditWindow::on_kcpReadBufferSB_valueChanged(int arg1)
{
stream.kcpSettings.readBufferSize = arg1;
}
void ConnectionEditWindow::on_kcpWriteBufferSB_valueChanged(int arg1)
{
stream.kcpSettings.writeBufferSize = arg1;
}
void ConnectionEditWindow::on_kcpHeaderType_currentTextChanged(const QString &arg1)
{
stream.kcpSettings.header.type = arg1.toStdString();
}

View File

@ -36,18 +36,12 @@ class ConnectionEditWindow : public QDialog
void on_tranportCombo_currentIndexChanged(const QString &arg1);
void on_comboBox_currentIndexChanged(const QString &arg1);
void on_httpPathTxt_textEdited(const QString &arg1);
void on_httpHostTxt_textChanged();
void on_lineEdit_textEdited(const QString &arg1);
void on_wsHeadersTxt_textChanged();
void on_spinBox_valueChanged(int arg1);
void on_tcpRequestDefBtn_clicked();
void on_tcpRespDefBtn_clicked();
@ -72,6 +66,30 @@ class ConnectionEditWindow : public QDialog
void on_quicHeaderTypeCB_currentIndexChanged(const QString &arg1);
void on_tcpRequestPrettifyBtn_clicked();
void on_tcpRespPrettifyBtn_clicked();
void on_tcpHeaderTypeCB_currentIndexChanged(const QString &arg1);
void on_wsPathTxt_textEdited(const QString &arg1);
void on_kcpMTU_valueChanged(int arg1);
void on_kcpTTI_valueChanged(int arg1);
void on_kcpUploadCapacSB_valueChanged(int arg1);
void on_kcpCongestionCB_stateChanged(int arg1);
void on_kcpDownCapacitySB_valueChanged(int arg1);
void on_kcpReadBufferSB_valueChanged(int arg1);
void on_kcpWriteBufferSB_valueChanged(int arg1);
void on_kcpHeaderType_currentTextChanged(const QString &arg1);
private:
QString _alias;
void LoadGUIContents();

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>1012</width>
<height>547</height>
<height>574</height>
</rect>
</property>
<property name="sizePolicy">
@ -227,7 +227,7 @@
</size>
</property>
<property name="currentIndex">
<number>2</number>
<number>0</number>
</property>
<property name="usesScrollButtons">
<bool>true</bool>
@ -237,7 +237,7 @@
<string>TCP</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<item row="0" column="0" colspan="4">
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,5">
<item row="0" column="1">
<widget class="QComboBox" name="tcpHeaderTypeCB">
@ -269,14 +269,14 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="1" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>#Response</string>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="2" column="0" colspan="2">
<widget class="QPlainTextEdit" name="tcpRequestTxt">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
@ -289,7 +289,7 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="2" column="2" colspan="2">
<widget class="QPlainTextEdit" name="tcpRespTxt">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
@ -307,12 +307,26 @@
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="tcpRequestPrettifyBtn">
<property name="text">
<string>#Prettify</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="tcpRespDefBtn">
<property name="text">
<string>#InsertDefaultContent</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="tcpRespPrettifyBtn">
<property name="text">
<string>#Prettify</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="httpTab">

View File

@ -105,6 +105,7 @@ void MainWindow::on_stopButton_clicked()
{
LOG("Stop connection!")
this->vinstance->Stop();
QFile(QV2RAY_GENERATED_CONFIG_FILE_PATH).remove();
ui->statusLabel->setText(tr("#Stopped"));
ui->logText->clear();
trayMenu->actions()[2]->setEnabled(true);
@ -126,6 +127,7 @@ void MainWindow::on_clbutton_clicked()
void MainWindow::closeEvent(QCloseEvent *event)
{
this->hide();
trayMenu->actions()[0]->setText(tr("#Show"));
event->ignore();
}
@ -141,13 +143,6 @@ void MainWindow::on_activatedTray(QSystemTrayIcon::ActivationReason reason)
#endif
break;
case QSystemTrayIcon::DoubleClick:
if (this->isHidden()) {
this->show();
}
break;
case QSystemTrayIcon::MiddleClick:
if (this->vinstance->Status == Qv2ray::STOPPED) {
on_startButton_clicked();
@ -244,14 +239,16 @@ void MainWindow::on_delConfigBtn_clicked()
{
auto conf = GetGlobalConfig();
QList<string> list = QList<string>::fromStdList(conf.configs);
auto currentSelected = ui->connectionListWidget->currentItem()->text();
auto currentSelected = ui->connectionListWidget->currentIndex().row();
if (currentSelected == CurrentConnectionName) {
if (currentSelected < 0) return;
if (ui->connectionListWidget->item(currentSelected)->text() == CurrentConnectionName) {
on_stopButton_clicked();
CurrentConnectionName = "";
}
list.removeOne(currentSelected.toStdString());
list.removeOne(ui->connectionListWidget->item(currentSelected)->text().toStdString());
conf.configs = list.toStdList();
SetGlobalConfig(conf);
SaveGlobalConfig();
@ -262,7 +259,6 @@ void MainWindow::on_prefrencesBtn_clicked()
{
PrefrencesWindow *w = new PrefrencesWindow(this);
connect(w, &PrefrencesWindow::s_reload_config, this, &MainWindow::reload_config);
w->ReloadCurrentConfig();
w->show();
}

View File

@ -9,7 +9,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>568</width>
<width>607</width>
<height>457</height>
</rect>
</property>
@ -25,12 +25,6 @@
<height>457</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>866</width>
<height>990</height>
</size>
</property>
<property name="windowTitle">
<string>Qv2ray</string>
</property>
@ -41,8 +35,8 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="4">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1,1,1,0,0,0,0">
<property name="spacing">
<number>5</number>
@ -117,191 +111,175 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1,1">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>#HostList</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="connectionListWidget">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="lineWidth">
<number>1</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::CopyAction</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="viewMode">
<enum>QListView::ListMode</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="importConfigBtn">
<property name="text">
<string>#ImportConfig</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addConfigBtn">
<property name="text">
<string>#AddConfig</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="delConfigBtn">
<property name="text">
<string>#RemoveConfig</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>#ConfigDetail</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="verticalSpacing">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>#Host</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="_hostLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>#Port</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="_portLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>#UUID</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="_uuidLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>#Transport</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="_transportLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>#ConnectionSettings</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="editConnectionSettingsBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>#ConnectionSettings</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
<item row="1" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>#HostList</string>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>#Log</string>
</property>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="logText">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
</widget>
</item>
</layout>
<item row="1" column="3" rowspan="3">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>#ConfigDetail</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="verticalSpacing">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>#Host</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="_hostLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>#Port</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="_portLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>#UUID</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="_uuidLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>#Transport</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="_transportLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>#ConnectionSettings</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="editConnectionSettingsBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>#ConnectionSettings</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QListWidget" name="connectionListWidget">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="lineWidth">
<number>1</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::CopyAction</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="viewMode">
<enum>QListView::ListMode</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="importConfigBtn">
<property name="text">
<string>#ImportConfig</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="addConfigBtn">
<property name="text">
<string>#AddConfig</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="delConfigBtn">
<property name="text">
<string>#RemoveConfig</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>#Log</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="4">
<widget class="QTextBrowser" name="logText">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
</widget>
</item>
</layout>
</widget>

View File

@ -1,6 +1,7 @@
#include "QvUtils.h"
#include "QvCoreInteractions.h"
#include "w_PrefrencesWindow.h"
#include <QFileDialog>
#ifndef _WIN32
#include <unistd.h>
@ -11,11 +12,6 @@ PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent),
ui(new Ui::PrefrencesWindow)
{
ui->setupUi(this);
ReloadCurrentConfig();
}
void PrefrencesWindow::ReloadCurrentConfig()
{
CurrentConfig = GetGlobalConfig();
//
ui->languageComboBox->setCurrentText(QString::fromStdString(CurrentConfig.language));
@ -56,11 +52,13 @@ void PrefrencesWindow::ReloadCurrentConfig()
ui->proxyDefaultCb->setChecked(CurrentConfig.proxyDefault);
ui->localDNSCb->setChecked(CurrentConfig.withLocalDNS);
//
ui->DNSListListBox->clear();
ui->DNSListTxt->clear();
foreach (auto dnsStr, CurrentConfig.dnsList) {
ui->DNSListListBox->addItem(QString::fromStdString(dnsStr));
ui->DNSListTxt->appendPlainText(QString::fromStdString(dnsStr) + "\r\n");
}
finishedLoading = true;
}
PrefrencesWindow::~PrefrencesWindow()
@ -227,3 +225,42 @@ void PrefrencesWindow::on_localDNSCb_stateChanged(int arg1)
{
CurrentConfig.withLocalDNS = arg1 == Qt::Checked;
}
void PrefrencesWindow::on_selectVCoreBtn_clicked()
{
QString dir = QFileDialog::getOpenFileName(this, tr("#OpenVCoreFile"), QDir::homePath());
ui->vCoreExePathTxt->setText(dir);
on_vCoreExePathTxt_textEdited(dir);
}
void PrefrencesWindow::on_selectVAssetBtn_clicked()
{
QString dir = QFileDialog::getExistingDirectory(this, tr("OpenVAssetsDir"), QDir::homePath());
ui->vCoreAssetsPathTxt->setText(dir);
on_vCoreAssetsPathTxt_textChanged(dir);
}
void PrefrencesWindow::on_DNSListTxt_textChanged()
{
if (finishedLoading) {
try {
QStringList hosts = ui->DNSListTxt->toPlainText().replace("\r", "").split("\n");
CurrentConfig.dnsList.clear();
foreach (auto host, hosts) {
if (host != "" && host != "\r") {
// Not empty, so we save.
CurrentConfig.dnsList.push_back(host.toStdString());
}
}
WHITE(DNSListTxt)
} catch (...) {
RED(DNSListTxt)
}
}
}
void PrefrencesWindow::on_vCoreAssetsPathTxt_textChanged(const QString &arg1)
{
CurrentConfig.v2AssetsPath = arg1.toStdString();
}

View File

@ -17,7 +17,6 @@ class PrefrencesWindow : public QDialog
public:
explicit PrefrencesWindow(QWidget *parent = nullptr);
~PrefrencesWindow();
void ReloadCurrentConfig();
signals:
void s_reload_config();
private slots:
@ -63,7 +62,16 @@ class PrefrencesWindow : public QDialog
void on_localDNSCb_stateChanged(int arg1);
void on_selectVCoreBtn_clicked();
void on_selectVAssetBtn_clicked();
void on_DNSListTxt_textChanged();
void on_vCoreAssetsPathTxt_textChanged(const QString &arg1);
private:
bool finishedLoading = false;
Qv2ray::QvConfigModels::Qv2Config_v1 CurrentConfig;
Ui::PrefrencesWindow *ui;
};

View File

@ -23,7 +23,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>3</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
@ -37,6 +37,26 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="languageComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>zh-CN</string>
</property>
</item>
<item>
<property name="text">
<string>en-US</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
@ -107,7 +127,18 @@
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="vCoreExePathTxt"/>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLineEdit" name="vCoreExePathTxt"/>
</item>
<item>
<widget class="QPushButton" name="selectVCoreBtn">
<property name="text">
<string>#Select</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_15">
@ -117,27 +148,18 @@
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="vCoreAssetsPathTxt"/>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="languageComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<property name="text">
<string>zh-CN</string>
</property>
<widget class="QLineEdit" name="vCoreAssetsPathTxt"/>
</item>
<item>
<property name="text">
<string>en-US</string>
</property>
<widget class="QPushButton" name="selectVAssetBtn">
<property name="text">
<string>#Select</string>
</property>
</widget>
</item>
</widget>
</layout>
</item>
</layout>
</widget>
@ -406,32 +428,7 @@
</widget>
</item>
<item>
<widget class="QListWidget" name="DNSListListBox"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="addDNStoListBtn">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="removeDNSinListBtn">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="chearDNSListBtn">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
<widget class="QPlainTextEdit" name="DNSListTxt"/>
</item>
</layout>
</widget>

View File

@ -10,7 +10,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="31"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="336"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="350"/>
<source>#Host</source>
<translation>Host</translation>
</message>
@ -31,7 +31,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="86"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="649"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="663"/>
<source>#Security</source>
<translation>Security Settings</translation>
</message>
@ -52,8 +52,8 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="259"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="567"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="716"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="581"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="730"/>
<source>#Type</source>
<translation>Type</translation>
</message>
@ -64,7 +64,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="305"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="312"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="319"/>
<source>#InsertDefaultContent</source>
<translation>Insert Default Content</translation>
</message>
@ -84,82 +84,88 @@
<translation>Generate JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="320"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="312"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="326"/>
<source>#Prettify</source>
<translation>Prettify JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="334"/>
<source>HTTP</source>
<translation>HTTP</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="326"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="355"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="626"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="340"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="369"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="640"/>
<source>#Path</source>
<translation>Path</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="347"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="361"/>
<source>WebSocket</source>
<translation>WebSocket</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="371"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="695"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="385"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="709"/>
<source>#Headers</source>
<translation>Headers</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="378"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="392"/>
<source>#key|value format</source>
<translation>Format: KEY|VALUE</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="389"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="403"/>
<source>mKCP</source>
<translation>mKCP</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="397"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="411"/>
<source>#MTU</source>
<translation>MTU</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="423"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="437"/>
<source>#TTI (ms)</source>
<translation>TTI (ms)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="449"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="463"/>
<source>#UplinkCapacity (MB/s)</source>
<translation>Uplink Capacity (MB/s)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="472"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="486"/>
<source>#Congestion</source>
<translation>Congestion Control</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="769"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="783"/>
<source>SockOpt</source>
<translation>SockOpt</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="775"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="789"/>
<source>#Mark</source>
<translation>Mark</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="785"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="799"/>
<source>#TCPFastOpen</source>
<translation>TCP Fast Open</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="799"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="813"/>
<source>#TProxy</source>
<translation>Transparent Proxy Mode</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="165"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="479"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="792"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="493"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="806"/>
<source>#Enabled</source>
<translation>Enabled</translation>
</message>
@ -169,41 +175,53 @@
<translation>Preview Generated JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="490"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="504"/>
<source>#DownlinkCapacity (MB/s)</source>
<translation>Downlink Capacity (MB/s)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="513"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="527"/>
<source>#ReadBufferSize (MB)</source>
<translation>Read Buffer Size (MB)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="536"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="550"/>
<source>#WriteBufferSize (MB)</source>
<translation>Write Buffer Size (MB)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="561"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="708"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="575"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="722"/>
<source>#Header</source>
<translation>Headers</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="618"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="632"/>
<source>DomainSocket</source>
<translation>DomainSocket</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="643"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="657"/>
<source>QUIC</source>
<translation>QUIC</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="681"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="695"/>
<source>#Key</source>
<translation>Key</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.cpp" line="303"/>
<location filename="../src/w_ConnectionEditWindow.cpp" line="314"/>
<source>#JsonPrettify</source>
<translation>Prettify JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.cpp" line="303"/>
<location filename="../src/w_ConnectionEditWindow.cpp" line="314"/>
<source>#JsonContainsError</source>
<translation>JSON is in a bad syntax</translation>
</message>
</context>
<context>
<name>ImportConfigWindow</name>
@ -297,127 +315,127 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../src/w_MainWindow.ui" line="35"/>
<location filename="../src/w_MainWindow.ui" line="29"/>
<source>Qv2ray</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="53"/>
<location filename="../src/w_MainWindow.ui" line="331"/>
<location filename="../src/w_MainWindow.ui" line="47"/>
<location filename="../src/w_MainWindow.ui" line="309"/>
<location filename="../src/w_MainWindow.cpp" line="28"/>
<source>#Start</source>
<translation>Start</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="60"/>
<location filename="../src/w_MainWindow.ui" line="336"/>
<location filename="../src/w_MainWindow.ui" line="54"/>
<location filename="../src/w_MainWindow.ui" line="314"/>
<location filename="../src/w_MainWindow.cpp" line="29"/>
<source>#Stop</source>
<translation>Stop</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="67"/>
<location filename="../src/w_MainWindow.ui" line="341"/>
<location filename="../src/w_MainWindow.ui" line="61"/>
<location filename="../src/w_MainWindow.ui" line="319"/>
<location filename="../src/w_MainWindow.cpp" line="30"/>
<source>#Restart</source>
<translation>Restart</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="77"/>
<location filename="../src/w_MainWindow.ui" line="71"/>
<source>#ClearLog</source>
<translation>Clear Log</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="107"/>
<location filename="../src/w_MainWindow.ui" line="101"/>
<source>#Status</source>
<translation>Status</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="114"/>
<location filename="../src/w_MainWindow.cpp" line="108"/>
<location filename="../src/w_MainWindow.ui" line="108"/>
<location filename="../src/w_MainWindow.cpp" line="109"/>
<source>#Stopped</source>
<translation>Stopped</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="127"/>
<location filename="../src/w_MainWindow.ui" line="117"/>
<source>#HostList</source>
<translation>Host List</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="170"/>
<location filename="../src/w_MainWindow.ui" line="252"/>
<source>#ImportConfig</source>
<translation>Import Config</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="177"/>
<location filename="../src/w_MainWindow.ui" line="259"/>
<source>#AddConfig</source>
<translation>Add Config</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="184"/>
<location filename="../src/w_MainWindow.ui" line="266"/>
<source>#RemoveConfig</source>
<translation>Remove Config</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="195"/>
<location filename="../src/w_MainWindow.ui" line="124"/>
<source>#ConfigDetail</source>
<translation>Detailed Config Info</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="207"/>
<location filename="../src/w_MainWindow.ui" line="136"/>
<source>#Host</source>
<translation>Host</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="221"/>
<location filename="../src/w_MainWindow.ui" line="150"/>
<source>#Port</source>
<translation>Port</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="235"/>
<location filename="../src/w_MainWindow.ui" line="164"/>
<source>#UUID</source>
<translation>UUID</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="249"/>
<location filename="../src/w_MainWindow.ui" line="178"/>
<source>#Transport</source>
<translation>Transport Settings</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="263"/>
<location filename="../src/w_MainWindow.ui" line="276"/>
<location filename="../src/w_MainWindow.ui" line="192"/>
<location filename="../src/w_MainWindow.ui" line="205"/>
<source>#ConnectionSettings</source>
<translation>Connection Settings</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="293"/>
<location filename="../src/w_MainWindow.ui" line="273"/>
<source>#Log</source>
<translation>Log</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="311"/>
<location filename="../src/w_MainWindow.ui" line="289"/>
<source>#ManuallyCreateConnection</source>
<translation>Manually Create Connection</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="316"/>
<location filename="../src/w_MainWindow.ui" line="294"/>
<source>#ImportConnection</source>
<translation>Import Config File</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="321"/>
<location filename="../src/w_MainWindow.ui" line="299"/>
<source>#Exit</source>
<translation>Exit</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="84"/>
<location filename="../src/w_MainWindow.ui" line="326"/>
<location filename="../src/w_MainWindow.ui" line="78"/>
<location filename="../src/w_MainWindow.ui" line="304"/>
<source>#Preferences</source>
<translation>Preferences</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="26"/>
<location filename="../src/w_MainWindow.cpp" line="169"/>
<location filename="../src/w_MainWindow.cpp" line="164"/>
<source>#Hide</source>
<translation>Hide</translation>
</message>
@ -442,7 +460,8 @@
<translation>Started</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="172"/>
<location filename="../src/w_MainWindow.cpp" line="130"/>
<location filename="../src/w_MainWindow.cpp" line="167"/>
<source>#Show</source>
<translation>Show</translation>
</message>
@ -451,8 +470,8 @@
<name>PrefrencesWindow</name>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="20"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="74"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="140"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="72"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="138"/>
<source>Prefrences</source>
<translation>Preferences</translation>
</message>
@ -467,188 +486,201 @@
<translation>Language</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="132"/>
<location filename="../src/w_PrefrencesWindow.ui" line="50"/>
<source>zh-CN</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="137"/>
<location filename="../src/w_PrefrencesWindow.ui" line="55"/>
<source>en-US</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="43"/>
<location filename="../src/w_PrefrencesWindow.ui" line="63"/>
<source>#RunAsRoot</source>
<translation>Run v2ray as root</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="50"/>
<location filename="../src/w_PrefrencesWindow.ui" line="152"/>
<location filename="../src/w_PrefrencesWindow.ui" line="159"/>
<location filename="../src/w_PrefrencesWindow.ui" line="229"/>
<location filename="../src/w_PrefrencesWindow.ui" line="236"/>
<location filename="../src/w_PrefrencesWindow.ui" line="302"/>
<location filename="../src/w_PrefrencesWindow.ui" line="316"/>
<location filename="../src/w_PrefrencesWindow.ui" line="364"/>
<location filename="../src/w_PrefrencesWindow.ui" line="385"/>
<location filename="../src/w_PrefrencesWindow.ui" line="392"/>
<location filename="../src/w_PrefrencesWindow.ui" line="70"/>
<location filename="../src/w_PrefrencesWindow.ui" line="174"/>
<location filename="../src/w_PrefrencesWindow.ui" line="181"/>
<location filename="../src/w_PrefrencesWindow.ui" line="251"/>
<location filename="../src/w_PrefrencesWindow.ui" line="258"/>
<location filename="../src/w_PrefrencesWindow.ui" line="324"/>
<location filename="../src/w_PrefrencesWindow.ui" line="338"/>
<location filename="../src/w_PrefrencesWindow.ui" line="386"/>
<location filename="../src/w_PrefrencesWindow.ui" line="407"/>
<location filename="../src/w_PrefrencesWindow.ui" line="414"/>
<source>#Enabled</source>
<translation>Enabled</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="57"/>
<location filename="../src/w_PrefrencesWindow.ui" line="77"/>
<source>#LogLevel</source>
<translation>Log Level</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="82"/>
<location filename="../src/w_PrefrencesWindow.ui" line="102"/>
<source>debug</source>
<translation>Debug</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="87"/>
<location filename="../src/w_PrefrencesWindow.ui" line="107"/>
<source>info</source>
<translation>Info</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="92"/>
<location filename="../src/w_PrefrencesWindow.ui" line="112"/>
<source>warning</source>
<translation>Warning</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="97"/>
<location filename="../src/w_PrefrencesWindow.ui" line="117"/>
<source>error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="357"/>
<location filename="../src/w_PrefrencesWindow.ui" line="137"/>
<location filename="../src/w_PrefrencesWindow.ui" line="158"/>
<source>#Select</source>
<translation>Select</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="379"/>
<source>#ProxyGlobal</source>
<translation>Use Proxy as Default</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="371"/>
<location filename="../src/w_PrefrencesWindow.ui" line="393"/>
<source>#ProxyCN</source>
<translation>Use Proxy for China Mainland</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="378"/>
<location filename="../src/w_PrefrencesWindow.ui" line="400"/>
<source>#WithLocalDNS</source>
<translation>Use localhost DNS</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="404"/>
<location filename="../src/w_PrefrencesWindow.ui" line="426"/>
<source>#DNSList</source>
<translation>DNS Address List</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="416"/>
<source>Add</source>
<translation>Add</translation>
<translation type="vanished">Add</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="423"/>
<source>Remove</source>
<translation>Remove</translation>
<translation type="vanished">Remove</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="430"/>
<source>Clear</source>
<translation>Clear</translation>
<translation type="vanished">Clear</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="77"/>
<location filename="../src/w_PrefrencesWindow.ui" line="97"/>
<source>none</source>
<translation>Do not use</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="105"/>
<location filename="../src/w_PrefrencesWindow.ui" line="125"/>
<source>#VCoreExePath</source>
<translation>V2ray Kernal Path</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="115"/>
<location filename="../src/w_PrefrencesWindow.ui" line="146"/>
<source>#VCoreAssetsPath</source>
<translation>V2ray Assets Path</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="146"/>
<location filename="../src/w_PrefrencesWindow.ui" line="168"/>
<source>#MuxSettings</source>
<translation>Mux Settings</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="187"/>
<location filename="../src/w_PrefrencesWindow.ui" line="209"/>
<source>#InBoundSettings</source>
<translation>Inbound Settings</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="195"/>
<location filename="../src/w_PrefrencesWindow.ui" line="217"/>
<source>#ListenIP</source>
<translation>Listen IP</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="273"/>
<location filename="../src/w_PrefrencesWindow.ui" line="295"/>
<source>#HTTPInBoundSettings</source>
<translation>HTTP Inbound Settings</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="209"/>
<location filename="../src/w_PrefrencesWindow.ui" line="231"/>
<source>#SOCKSBoundSettings</source>
<translation>SOCKS Inbound Settings</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="349"/>
<location filename="../src/w_PrefrencesWindow.ui" line="371"/>
<source>#RouteSettings</source>
<translation>Route Settings</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="166"/>
<location filename="../src/w_PrefrencesWindow.ui" line="188"/>
<source>#Concurrency</source>
<translation>Maximum Connections</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="215"/>
<location filename="../src/w_PrefrencesWindow.ui" line="279"/>
<location filename="../src/w_PrefrencesWindow.ui" line="237"/>
<location filename="../src/w_PrefrencesWindow.ui" line="301"/>
<source>#Port</source>
<translation>Port</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="253"/>
<location filename="../src/w_PrefrencesWindow.ui" line="323"/>
<location filename="../src/w_PrefrencesWindow.ui" line="275"/>
<location filename="../src/w_PrefrencesWindow.ui" line="345"/>
<source>#Username</source>
<translation>Username</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="243"/>
<location filename="../src/w_PrefrencesWindow.ui" line="309"/>
<location filename="../src/w_PrefrencesWindow.ui" line="265"/>
<location filename="../src/w_PrefrencesWindow.ui" line="331"/>
<source>#Auth</source>
<translation>Authentication</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="260"/>
<location filename="../src/w_PrefrencesWindow.ui" line="333"/>
<location filename="../src/w_PrefrencesWindow.ui" line="282"/>
<location filename="../src/w_PrefrencesWindow.ui" line="355"/>
<source>#Password</source>
<translation>Password</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="74"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="72"/>
<source>PortNumbersCannotBeSame</source>
<translation>Port numbers cannot be the same</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="140"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="138"/>
<source>RunAsRootNotOnWindows</source>
<translation>Run as root is not avaliable on Windows Platform</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="231"/>
<source>#OpenVCoreFile</source>
<translation>Open v2rat-core file</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="238"/>
<source>OpenVAssetsDir</source>
<translation>Open v2ray assets folder</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/main.cpp" line="91"/>
<location filename="../src/main.cpp" line="86"/>
<source>AnotherInstanceRunning</source>
<translation>Another instance is already running</translation>
</message>
<message>
<location filename="../src/main.cpp" line="91"/>
<location filename="../src/main.cpp" line="86"/>
<source>Qv2ray</source>
<translation></translation>
</message>

View File

@ -10,7 +10,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="31"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="336"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="350"/>
<source>#Host</source>
<translation></translation>
</message>
@ -31,7 +31,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="86"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="649"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="663"/>
<source>#Security</source>
<translation></translation>
</message>
@ -52,8 +52,8 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="259"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="567"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="716"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="581"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="730"/>
<source>#Type</source>
<translation></translation>
</message>
@ -64,7 +64,7 @@
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="305"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="312"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="319"/>
<source>#InsertDefaultContent</source>
<translation></translation>
</message>
@ -84,82 +84,88 @@
<translation> JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="320"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="312"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="326"/>
<source>#Prettify</source>
<translation> JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="334"/>
<source>HTTP</source>
<translation>HTTP</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="326"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="355"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="626"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="340"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="369"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="640"/>
<source>#Path</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="347"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="361"/>
<source>WebSocket</source>
<translation>WebSocket</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="371"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="695"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="385"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="709"/>
<source>#Headers</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="378"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="392"/>
<source>#key|value format</source>
<translation>|</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="389"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="403"/>
<source>mKCP</source>
<translation>mKCP</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="397"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="411"/>
<source>#MTU</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="423"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="437"/>
<source>#TTI (ms)</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="449"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="463"/>
<source>#UplinkCapacity (MB/s)</source>
<translation> (MB/s)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="472"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="486"/>
<source>#Congestion</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="769"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="783"/>
<source>SockOpt</source>
<translation>SockOpt</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="775"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="789"/>
<source>#Mark</source>
<translation>Mark</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="785"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="799"/>
<source>#TCPFastOpen</source>
<translation>TCP Fast Open</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="799"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="813"/>
<source>#TProxy</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="165"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="479"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="792"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="493"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="806"/>
<source>#Enabled</source>
<translation></translation>
</message>
@ -169,41 +175,53 @@
<translation>JSON预览</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="490"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="504"/>
<source>#DownlinkCapacity (MB/s)</source>
<translation> (MB/s)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="513"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="527"/>
<source>#ReadBufferSize (MB)</source>
<translation> (MB)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="536"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="550"/>
<source>#WriteBufferSize (MB)</source>
<translation> (MB)</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="561"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="708"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="575"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="722"/>
<source>#Header</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="618"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="632"/>
<source>DomainSocket</source>
<translation>DomainSocket</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="643"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="657"/>
<source>QUIC</source>
<translation>QUIC</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.ui" line="681"/>
<location filename="../src/w_ConnectionEditWindow.ui" line="695"/>
<source>#Key</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.cpp" line="303"/>
<location filename="../src/w_ConnectionEditWindow.cpp" line="314"/>
<source>#JsonPrettify</source>
<translation> JSON</translation>
</message>
<message>
<location filename="../src/w_ConnectionEditWindow.cpp" line="303"/>
<location filename="../src/w_ConnectionEditWindow.cpp" line="314"/>
<source>#JsonContainsError</source>
<translation>JSON </translation>
</message>
</context>
<context>
<name>ImportConfigWindow</name>
@ -297,127 +315,127 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../src/w_MainWindow.ui" line="35"/>
<location filename="../src/w_MainWindow.ui" line="29"/>
<source>Qv2ray</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="53"/>
<location filename="../src/w_MainWindow.ui" line="331"/>
<location filename="../src/w_MainWindow.ui" line="47"/>
<location filename="../src/w_MainWindow.ui" line="309"/>
<location filename="../src/w_MainWindow.cpp" line="28"/>
<source>#Start</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="60"/>
<location filename="../src/w_MainWindow.ui" line="336"/>
<location filename="../src/w_MainWindow.ui" line="54"/>
<location filename="../src/w_MainWindow.ui" line="314"/>
<location filename="../src/w_MainWindow.cpp" line="29"/>
<source>#Stop</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="67"/>
<location filename="../src/w_MainWindow.ui" line="341"/>
<location filename="../src/w_MainWindow.ui" line="61"/>
<location filename="../src/w_MainWindow.ui" line="319"/>
<location filename="../src/w_MainWindow.cpp" line="30"/>
<source>#Restart</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="77"/>
<location filename="../src/w_MainWindow.ui" line="71"/>
<source>#ClearLog</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="107"/>
<location filename="../src/w_MainWindow.ui" line="101"/>
<source>#Status</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="114"/>
<location filename="../src/w_MainWindow.cpp" line="108"/>
<location filename="../src/w_MainWindow.ui" line="108"/>
<location filename="../src/w_MainWindow.cpp" line="109"/>
<source>#Stopped</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="127"/>
<location filename="../src/w_MainWindow.ui" line="117"/>
<source>#HostList</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="170"/>
<location filename="../src/w_MainWindow.ui" line="252"/>
<source>#ImportConfig</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="177"/>
<location filename="../src/w_MainWindow.ui" line="259"/>
<source>#AddConfig</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="184"/>
<location filename="../src/w_MainWindow.ui" line="266"/>
<source>#RemoveConfig</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="195"/>
<location filename="../src/w_MainWindow.ui" line="124"/>
<source>#ConfigDetail</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="207"/>
<location filename="../src/w_MainWindow.ui" line="136"/>
<source>#Host</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="221"/>
<location filename="../src/w_MainWindow.ui" line="150"/>
<source>#Port</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="235"/>
<location filename="../src/w_MainWindow.ui" line="164"/>
<source>#UUID</source>
<translation>UUID</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="249"/>
<location filename="../src/w_MainWindow.ui" line="178"/>
<source>#Transport</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="263"/>
<location filename="../src/w_MainWindow.ui" line="276"/>
<location filename="../src/w_MainWindow.ui" line="192"/>
<location filename="../src/w_MainWindow.ui" line="205"/>
<source>#ConnectionSettings</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="293"/>
<location filename="../src/w_MainWindow.ui" line="273"/>
<source>#Log</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="311"/>
<location filename="../src/w_MainWindow.ui" line="289"/>
<source>#ManuallyCreateConnection</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="316"/>
<location filename="../src/w_MainWindow.ui" line="294"/>
<source>#ImportConnection</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="321"/>
<location filename="../src/w_MainWindow.ui" line="299"/>
<source>#Exit</source>
<translation>退</translation>
</message>
<message>
<location filename="../src/w_MainWindow.ui" line="84"/>
<location filename="../src/w_MainWindow.ui" line="326"/>
<location filename="../src/w_MainWindow.ui" line="78"/>
<location filename="../src/w_MainWindow.ui" line="304"/>
<source>#Preferences</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="26"/>
<location filename="../src/w_MainWindow.cpp" line="169"/>
<location filename="../src/w_MainWindow.cpp" line="164"/>
<source>#Hide</source>
<translation></translation>
</message>
@ -442,7 +460,8 @@
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="172"/>
<location filename="../src/w_MainWindow.cpp" line="130"/>
<location filename="../src/w_MainWindow.cpp" line="167"/>
<source>#Show</source>
<translation></translation>
</message>
@ -451,8 +470,8 @@
<name>PrefrencesWindow</name>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="20"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="74"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="140"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="72"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="138"/>
<source>Prefrences</source>
<translation></translation>
</message>
@ -467,188 +486,201 @@
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="132"/>
<location filename="../src/w_PrefrencesWindow.ui" line="50"/>
<source>zh-CN</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="137"/>
<location filename="../src/w_PrefrencesWindow.ui" line="55"/>
<source>en-US</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="43"/>
<location filename="../src/w_PrefrencesWindow.ui" line="63"/>
<source>#RunAsRoot</source>
<translation>使 root </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="50"/>
<location filename="../src/w_PrefrencesWindow.ui" line="152"/>
<location filename="../src/w_PrefrencesWindow.ui" line="159"/>
<location filename="../src/w_PrefrencesWindow.ui" line="229"/>
<location filename="../src/w_PrefrencesWindow.ui" line="236"/>
<location filename="../src/w_PrefrencesWindow.ui" line="302"/>
<location filename="../src/w_PrefrencesWindow.ui" line="316"/>
<location filename="../src/w_PrefrencesWindow.ui" line="364"/>
<location filename="../src/w_PrefrencesWindow.ui" line="385"/>
<location filename="../src/w_PrefrencesWindow.ui" line="392"/>
<location filename="../src/w_PrefrencesWindow.ui" line="70"/>
<location filename="../src/w_PrefrencesWindow.ui" line="174"/>
<location filename="../src/w_PrefrencesWindow.ui" line="181"/>
<location filename="../src/w_PrefrencesWindow.ui" line="251"/>
<location filename="../src/w_PrefrencesWindow.ui" line="258"/>
<location filename="../src/w_PrefrencesWindow.ui" line="324"/>
<location filename="../src/w_PrefrencesWindow.ui" line="338"/>
<location filename="../src/w_PrefrencesWindow.ui" line="386"/>
<location filename="../src/w_PrefrencesWindow.ui" line="407"/>
<location filename="../src/w_PrefrencesWindow.ui" line="414"/>
<source>#Enabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="57"/>
<location filename="../src/w_PrefrencesWindow.ui" line="77"/>
<source>#LogLevel</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="82"/>
<location filename="../src/w_PrefrencesWindow.ui" line="102"/>
<source>debug</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="87"/>
<location filename="../src/w_PrefrencesWindow.ui" line="107"/>
<source>info</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="92"/>
<location filename="../src/w_PrefrencesWindow.ui" line="112"/>
<source>warning</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="97"/>
<location filename="../src/w_PrefrencesWindow.ui" line="117"/>
<source>error</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="357"/>
<location filename="../src/w_PrefrencesWindow.ui" line="137"/>
<location filename="../src/w_PrefrencesWindow.ui" line="158"/>
<source>#Select</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="379"/>
<source>#ProxyGlobal</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="371"/>
<location filename="../src/w_PrefrencesWindow.ui" line="393"/>
<source>#ProxyCN</source>
<translation>使</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="378"/>
<location filename="../src/w_PrefrencesWindow.ui" line="400"/>
<source>#WithLocalDNS</source>
<translation>使 DNS</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="404"/>
<location filename="../src/w_PrefrencesWindow.ui" line="426"/>
<source>#DNSList</source>
<translation>DNS </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="416"/>
<source>Add</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="423"/>
<source>Remove</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="430"/>
<source>Clear</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="77"/>
<location filename="../src/w_PrefrencesWindow.ui" line="97"/>
<source>none</source>
<translation>使</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="105"/>
<location filename="../src/w_PrefrencesWindow.ui" line="125"/>
<source>#VCoreExePath</source>
<translation>v2ray </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="115"/>
<location filename="../src/w_PrefrencesWindow.ui" line="146"/>
<source>#VCoreAssetsPath</source>
<translation>v2ray </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="146"/>
<location filename="../src/w_PrefrencesWindow.ui" line="168"/>
<source>#MuxSettings</source>
<translation>Mux </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="187"/>
<location filename="../src/w_PrefrencesWindow.ui" line="209"/>
<source>#InBoundSettings</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="195"/>
<location filename="../src/w_PrefrencesWindow.ui" line="217"/>
<source>#ListenIP</source>
<translation> IP</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="273"/>
<location filename="../src/w_PrefrencesWindow.ui" line="295"/>
<source>#HTTPInBoundSettings</source>
<translation>HTTP </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="209"/>
<location filename="../src/w_PrefrencesWindow.ui" line="231"/>
<source>#SOCKSBoundSettings</source>
<translation>SOCKS </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="349"/>
<location filename="../src/w_PrefrencesWindow.ui" line="371"/>
<source>#RouteSettings</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="166"/>
<location filename="../src/w_PrefrencesWindow.ui" line="188"/>
<source>#Concurrency</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="215"/>
<location filename="../src/w_PrefrencesWindow.ui" line="279"/>
<location filename="../src/w_PrefrencesWindow.ui" line="237"/>
<location filename="../src/w_PrefrencesWindow.ui" line="301"/>
<source>#Port</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="253"/>
<location filename="../src/w_PrefrencesWindow.ui" line="323"/>
<location filename="../src/w_PrefrencesWindow.ui" line="275"/>
<location filename="../src/w_PrefrencesWindow.ui" line="345"/>
<source>#Username</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="243"/>
<location filename="../src/w_PrefrencesWindow.ui" line="309"/>
<location filename="../src/w_PrefrencesWindow.ui" line="265"/>
<location filename="../src/w_PrefrencesWindow.ui" line="331"/>
<source>#Auth</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="260"/>
<location filename="../src/w_PrefrencesWindow.ui" line="333"/>
<location filename="../src/w_PrefrencesWindow.ui" line="282"/>
<location filename="../src/w_PrefrencesWindow.ui" line="355"/>
<source>#Password</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="74"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="72"/>
<source>PortNumbersCannotBeSame</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="140"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="138"/>
<source>RunAsRootNotOnWindows</source>
<translation>Windows </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="231"/>
<source>#OpenVCoreFile</source>
<translation> v2ray </translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="238"/>
<source>OpenVAssetsDir</source>
<translation> v2ray </translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/main.cpp" line="91"/>
<location filename="../src/main.cpp" line="86"/>
<source>AnotherInstanceRunning</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="91"/>
<location filename="../src/main.cpp" line="86"/>
<source>Qv2ray</source>
<translation></translation>
</message>