[RENAMED] Renamed from Hv2ray to Qv2ray

Former-commit-id: 08e6e26201
This commit is contained in:
Leroy.H.Y 2019-07-05 20:43:33 +08:00
parent 98408f7dd4
commit 05ae99eec4
33 changed files with 283 additions and 1303 deletions

View File

@ -7,7 +7,7 @@ install:
build_script: build_script:
- mkdir python37 && xcopy C:\Python37 python37 /E /H /Q - mkdir python37 && xcopy C:\Python37 python37 /E /H /Q
- tools\FixPythonWithMinGW.bat - tools\FixPythonWithMinGW.bat
- lrelease.exe Hv2ray.pro - lrelease.exe Qv2ray.pro
- mkdir build && cd build - mkdir build && cd build
- qmake ..\Hv2ray.pro - qmake ..\Qv2ray.pro
- mingw32-make - mingw32-make

18
.gitignore vendored
View File

@ -1,18 +1,6 @@
Hv2ray.pro.user *.pro.user
conf
Debug
Release
config.json
__pycache__/
geoip.dat
geosite.dat
v2ctl
v2ray
v2ray.sig
v2ctl.sig
./.vscode
*.qm *.qm
build/ build/
python37/ src/build/
tools/python-3.7.3.exe
./.vscode ./.vscode
tools/python-3.7.3.exe

View File

@ -22,7 +22,7 @@ before_script:
script: script:
- git submodule update --init - git submodule update --init
- lrelease ./Hv2ray.pro - lrelease ./Qv2ray.pro
- mkdir build && cd ./build - mkdir build && cd ./build
- QT_SELECT=5 QTDIR=/usr/share/qt5 qmake ../ - QT_SELECT=5 QTDIR=/usr/share/qt5 qmake ../
- make - make

View File

@ -7,13 +7,13 @@
**2019-07-01**: 休息了几天,主要是去关注别的项目了。现在开始重构 v2ray 交互部分。 **2019-07-01**: 休息了几天,主要是去关注别的项目了。现在开始重构 v2ray 交互部分。
**2019-06-24**: Mac OS 测试构建完成,合并到开发分支 [dev](https://github.com/lhy0403/Hv2ray/tree/dev) **2019-06-24**: Mac OS 测试构建完成,合并到开发分支 [dev](https://github.com/lhy0403/Qv2ray/tree/dev)
**2019-06-24**: 新建分支 MacOS-Build 开始测试 MacOS 构建,当前状态:![Build Status](https://travis-ci.com/lhy0403/Hv2ray.svg?branch=MacOS-Build) **2019-06-24**: 新建分支 MacOS-Build 开始测试 MacOS 构建,当前状态:![Build Status](https://travis-ci.com/lhy0403/Qv2ray.svg?branch=MacOS-Build)
**2019-06-23**: UI 结构已经固定,新建分支 translations 进行翻译 UI **2019-06-23**: UI 结构已经固定,新建分支 translations 进行翻译 UI
**2019-06-23**: 基本 UI 完成,切换到 [dev](https://github.com/lhy0403/Hv2ray/tree/dev) 分支进行代码实现 **2019-06-23**: 基本 UI 完成,切换到 [dev](https://github.com/lhy0403/Qv2ray/tree/dev) 分支进行代码实现
**2019-06-22**: 当前开发分支[ui-implementation](https://github.com/lhy0403/Hv2ray/tree/ui-implementation) - 用于实现基本 UI **2019-06-22**: 当前开发分支[ui-implementation](https://github.com/lhy0403/Qv2ray/tree/ui-implementation) - 用于实现基本 UI

View File

@ -8,7 +8,7 @@ QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Hv2ray TARGET = Qv2ray
TEMPLATE = app TEMPLATE = app
# The following define makes your compiler emit warnings if you use # The following define makes your compiler emit warnings if you use
@ -59,7 +59,7 @@ TRANSLATIONS += \
translations/zh-CN.ts \ translations/zh-CN.ts \
translations/en-US.ts translations/en-US.ts
RC_ICONS += ./icons/Hv2ray.ico RC_ICONS += ./icons/Qv2ray.ico
INCLUDEPATH += 3rdparty/\ INCLUDEPATH += 3rdparty/\
3rdparty/jsoncons/include 3rdparty/jsoncons/include

View File

@ -1,14 +1,14 @@
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/a034dd186c36408c92ffb04449fb6996)](https://app.codacy.com/app/lhy0403/Hv2ray?utm_source=github.com&utm_medium=referral&utm_content=lhy0403/Hv2ray&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/a034dd186c36408c92ffb04449fb6996)](https://app.codacy.com/app/lhy0403/Qv2ray?utm_source=github.com&utm_medium=referral&utm_content=lhy0403/Qv2ray&utm_campaign=Badge_Grade_Dashboard)
# Hv2ray [![HitCount](http://hits.dwyl.io/lhy0403/Hv2ray.svg)](http://hits.dwyl.io/lhy0403/Hv2ray) # Qv2ray [![HitCount](http://hits.dwyl.io/lhy0403/Qv2ray.svg)](http://hits.dwyl.io/lhy0403/Qv2ray)
TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多数功能尚未齐全。 TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多数功能尚未齐全。
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/lhy0403/Hv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Hv2ray/context:cpp) [![Total alerts](https://img.shields.io/lgtm/alerts/g/lhy0403/Hv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Hv2ray/alerts/) [![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/lhy0403/Qv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Qv2ray/context:cpp) [![Total alerts](https://img.shields.io/lgtm/alerts/g/lhy0403/Qv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Qv2ray/alerts/)
| OS | 主分支 [master](https://github.com/lhy0403/Hv2ray/tree/master) | 开发分支 [dev](https://github.com/lhy0403/Hv2ray/tree/dev) | | OS | 主分支 [master](https://github.com/lhy0403/Qv2ray/tree/master) | 开发分支 [dev](https://github.com/lhy0403/Qv2ray/tree/dev) |
| ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Linux & MacOS | [![Build Status](https://travis-ci.com/lhy0403/Hv2ray.svg?branch=master)](https://travis-ci.com/lhy0403/Hv2ray) | [![Build Status](https://travis-ci.com/lhy0403/Hv2ray.svg?branch=dev)](https://travis-ci.com/lhy0403/Hv2ray) | | Linux & MacOS | [![Build Status](https://travis-ci.com/lhy0403/Qv2ray.svg?branch=master)](https://travis-ci.com/lhy0403/Qv2ray) | [![Build Status](https://travis-ci.com/lhy0403/Qv2ray.svg?branch=dev)](https://travis-ci.com/lhy0403/Qv2ray) |
| Windows | [![Build status](https://ci.appveyor.com/api/projects/status/ml51d2s41pqmfgme/branch/master?svg=true)](https://ci.appveyor.com/project/lhy0403/hv2ray/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/ml51d2s41pqmfgme/branch/dev?svg=true)](https://ci.appveyor.com/project/lhy0403/hv2ray/branch/dev) | | Windows | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/master?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/dev?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/dev) |
## 最近更新内容 ## 最近更新内容
@ -19,6 +19,7 @@ TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多
# 鸣谢 # 鸣谢
[@aliyuchang33](https://github.com/aliyuchang33) - 项目原作者/发起人,感谢他使用 Qt 作为基础框架。 [@aliyuchang33](https://github.com/aliyuchang33) - 项目原作者/发起人,感谢他使用 Qt 作为基础框架。
- 可惜原项目不更新了qwq - 可惜原项目不更新了qwq
@ -41,8 +42,8 @@ TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多
- <span style="color: red">!! 该分支可能不稳定 或 甚至无法正常工作 !!</span> - <span style="color: red">!! 该分支可能不稳定 或 甚至无法正常工作 !!</span>
### Linux ### Linux
```bash ```bash
git clone https://github.com/lhy0403/Hv2ray && cd Hv2ray git clone https://github.com/lhy0403/Qv2ray && cd Qv2ray
lrelease ./Hv2ray.pro lrelease ./Qv2ray.pro
mkdir build && cd build mkdir build && cd build
qmake ../ qmake ../
make make

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

BIN
icons/Qv2ray.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
icons/Qv2ray.xcf Normal file

Binary file not shown.

View File

@ -1,7 +1,7 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>icons/Hv2ray.ico</file>
<file>translations/zh-CN.qm</file> <file>translations/zh-CN.qm</file>
<file>translations/en-US.qm</file> <file>translations/en-US.qm</file>
<file>icons/Qv2ray.ico</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -7,49 +7,46 @@
#include "vinteract.hpp" #include "vinteract.hpp"
// Macros // Macros
#define HV2RAY_CONFIG_DIR_NAME "/.hv2ray/" #define QV2RAY_CONFIG_DIR_NAME "/.qv2ray/"
using namespace std; using namespace std;
namespace Hv2ray namespace Qv2ray
{ {
namespace HConfigModels namespace QvConfigModels
{ {
struct HInbondSetting { struct QvInbondSetting {
bool enabled; bool enabled;
string ip; string ip;
int port; int port;
bool useAuthentication; bool useAuthentication;
string authUsername; string authUsername;
string authPassword; string authPassword;
HInbondSetting(): enabled(), ip(), port(), useAuthentication(), authUsername(), authPassword() {} QvInbondSetting(): enabled(), ip(), port(), useAuthentication(), authUsername(), authPassword() {}
HInbondSetting(bool _e, string _ip, int _p): HInbondSetting() QvInbondSetting(bool _e, string _ip, int _p): QvInbondSetting()
{ {
enabled = _e; enabled = _e;
port = _p; port = _p;
ip = _ip; ip = _ip;
} }
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(enabled, ip, port, useAuthentication, authUsername, authPassword)) XTOSTRUCT(O(enabled, ip, port, useAuthentication, authUsername, authPassword))
#endif
}; };
struct HvConfigList { struct QvConfigList {
string alias; string alias;
string fileName; string fileName;
int index; int index;
HvConfigList(): alias(), fileName(), index() {} QvConfigList(): alias(), fileName(), index() {}
XTOSTRUCT(O(alias, fileName, index)) XTOSTRUCT(O(alias, fileName, index))
}; };
struct Hv2Config { struct Qv2Config {
string language; string language;
bool runAsRoot; bool runAsRoot;
string logLevel; string logLevel;
//Hv2ray::V2ConfigModels::MuxObject muxSetting; QvInbondSetting httpSetting;
HInbondSetting httpSetting; QvInbondSetting socksSetting;
HInbondSetting socksSetting; list<QvConfigList> configs;
list<HvConfigList> configs; Qv2Config(): language(), runAsRoot(), logLevel(), httpSetting(), socksSetting(), configs() { }
Hv2Config(): language(), runAsRoot(), logLevel(), httpSetting(), socksSetting(), configs() { } Qv2Config(string lang, string log, QvInbondSetting httpIn, QvInbondSetting socksIN): Qv2Config()
Hv2Config(string lang, string log, HInbondSetting httpIn, HInbondSetting socksIN): Hv2Config()
{ {
language = lang; language = lang;
logLevel = log; logLevel = log;
@ -57,9 +54,7 @@ namespace Hv2ray
socksSetting = socksIN; socksSetting = socksIN;
runAsRoot = false; runAsRoot = false;
} }
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(language, runAsRoot, logLevel, httpSetting, socksSetting, configs)) XTOSTRUCT(O(language, runAsRoot, logLevel, httpSetting, socksSetting, configs))
#endif
}; };
} }
@ -67,10 +62,4 @@ namespace Hv2ray
/// place at first in main.cpp /// place at first in main.cpp
static QDir ConfigDir; static QDir ConfigDir;
} }
#if USE_TODO_FEATURES
JSONCONS_MEMBER_TRAITS_DECL(Hv2ray::HConfigModels::Hv2Config, language, runAsRoot, logLevel, httpSetting, socksSetting)
JSONCONS_MEMBER_TRAITS_DECL(Hv2ray::HConfigModels::HInbondSetting, enabled, ip, port, useAuthentication, authUsername, authPassword)
#endif
#endif // HCONFIGOBJECTS_HPP #endif // HCONFIGOBJECTS_HPP

View File

@ -1,17 +1,17 @@
#include "HUtils.hpp" #include "HUtils.hpp"
#include <QTextStream> #include <QTextStream>
namespace Hv2ray namespace Qv2ray
{ {
namespace Utils namespace Utils
{ {
static HConfigModels::Hv2Config GlobalConfig; static QvConfigModels::Qv2Config GlobalConfig;
void SetGlobalConfig(HConfigModels::Hv2Config conf) void SetGlobalConfig(QvConfigModels::Qv2Config conf)
{ {
GlobalConfig = conf; GlobalConfig = conf;
} }
HConfigModels::Hv2Config GetGlobalConfig() QvConfigModels::Qv2Config GetGlobalConfig()
{ {
return GlobalConfig; return GlobalConfig;
} }
@ -28,11 +28,11 @@ namespace Hv2ray
void LoadConfig(QFile *configFile) void LoadConfig(QFile *configFile)
{ {
using namespace Hv2ray::HConfigModels; using namespace Qv2ray::QvConfigModels;
configFile->open(QFile::ReadOnly); configFile->open(QFile::ReadOnly);
QTextStream stream(configFile); QTextStream stream(configFile);
auto str = stream.readAll(); auto str = stream.readAll();
auto config = StructFromJSON<Hv2Config>(str.toStdString()); auto config = StructFromJSON<Qv2Config>(str.toStdString());
SetGlobalConfig(config); SetGlobalConfig(config);
configFile->close(); configFile->close();
} }

View File

@ -14,14 +14,14 @@
#include "HConfigObjects.hpp" #include "HConfigObjects.hpp"
namespace Hv2ray namespace Qv2ray
{ {
namespace Utils namespace Utils
{ {
void showWarnMessageBox(QWidget *parent, QString title, QString text); void showWarnMessageBox(QWidget *parent, QString title, QString text);
QTranslator *getTranslator(string lang); QTranslator *getTranslator(string lang);
void SetGlobalConfig(HConfigModels::Hv2Config conf); void SetGlobalConfig(QvConfigModels::Qv2Config conf);
HConfigModels::Hv2Config GetGlobalConfig(); QvConfigModels::Qv2Config GetGlobalConfig();
void SaveConfig(QFile *configFile); void SaveConfig(QFile *configFile);
void LoadConfig(QFile *configFile); void LoadConfig(QFile *configFile);
/// Get file list in a Dir /// Get file list in a Dir

View File

@ -4,13 +4,8 @@
// TODO Features // TODO Features
#define USE_TODO_FEATURES false #define USE_TODO_FEATURES false
#if USE_TODO_FEATURES
#include <jsoncons/json.hpp>
using namespace jsoncons;
#else
#include <x2struct/x2struct.hpp> #include <x2struct/x2struct.hpp>
using namespace x2struct; using namespace x2struct;
#endif
#ifndef V2CONFIG_H #ifndef V2CONFIG_H
#define V2CONFIG_H #define V2CONFIG_H
@ -18,7 +13,7 @@ using namespace x2struct;
using namespace std; using namespace std;
/*------------------------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------------------*/
namespace Hv2ray namespace Qv2ray
{ {
namespace V2ConfigModels namespace V2ConfigModels
{ {
@ -33,18 +28,14 @@ namespace Hv2ray
string error; string error;
string loglevel; string loglevel;
LogObject(): access(), error(), loglevel() {} LogObject(): access(), error(), loglevel() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(access, error, loglevel)) XTOSTRUCT(O(access, error, loglevel))
#endif
}; };
struct ApiObject { struct ApiObject {
string tag; string tag;
list<string> services; list<string> services;
ApiObject() : tag(), services() {} ApiObject() : tag(), services() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(tag, services)) XTOSTRUCT(O(tag, services))
#endif
}; };
namespace DNSObjects namespace DNSObjects
{ {
@ -53,9 +44,7 @@ namespace Hv2ray
int port; int port;
list<string> domains; list<string> domains;
ServerObject(): address(), port(), domains() {} ServerObject(): address(), port(), domains() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(address, port, domains)) XTOSTRUCT(O(address, port, domains))
#endif
}; };
} }
struct DnsObject { struct DnsObject {
@ -67,9 +56,7 @@ namespace Hv2ray
list<string> servers; list<string> servers;
#endif #endif
DnsObject(): hosts(), servers() {} DnsObject(): hosts(), servers() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(hosts, servers)) XTOSTRUCT(O(hosts, servers))
#endif
}; };
namespace ROUTINGObjects namespace ROUTINGObjects
{ {
@ -85,17 +72,13 @@ namespace Hv2ray
string protocol; string protocol;
string attrs; string attrs;
RuleObject() : type(), domain(), ip(), port(), network(), source(), user(), inboundTag(), protocol(), attrs() {} RuleObject() : type(), domain(), ip(), port(), network(), source(), user(), inboundTag(), protocol(), attrs() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(type, domain, ip, port, network, source, user, inboundTag, protocol, attrs)) XTOSTRUCT(O(type, domain, ip, port, network, source, user, inboundTag, protocol, attrs))
#endif
}; };
struct BalancerObject { struct BalancerObject {
string tag ; string tag ;
list<string> selector; list<string> selector;
BalancerObject() : tag(), selector() {} BalancerObject() : tag(), selector() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(tag, selector)) XTOSTRUCT(O(tag, selector))
#endif
}; };
} }
@ -104,9 +87,7 @@ namespace Hv2ray
list<ROUTINGObjects::RuleObject> rules; list<ROUTINGObjects::RuleObject> rules;
list<ROUTINGObjects::BalancerObject> balancers; list<ROUTINGObjects::BalancerObject> balancers;
RoutingObject() : domainStrategy(), rules(), balancers() {} RoutingObject() : domainStrategy(), rules(), balancers() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(domainStrategy, rules, balancers)) XTOSTRUCT(O(domainStrategy, rules, balancers))
#endif
}; };
namespace POLICYObjects namespace POLICYObjects
{ {
@ -114,9 +95,7 @@ namespace Hv2ray
bool statsInboundUplink; bool statsInboundUplink;
bool statsInboundDownlink; bool statsInboundDownlink;
SystemPolicyObject() : statsInboundUplink(), statsInboundDownlink() {} SystemPolicyObject() : statsInboundUplink(), statsInboundDownlink() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(statsInboundUplink, statsInboundDownlink)) XTOSTRUCT(O(statsInboundUplink, statsInboundDownlink))
#endif
}; };
struct LevelPolicyObject { struct LevelPolicyObject {
@ -128,18 +107,14 @@ namespace Hv2ray
bool statsUserDownlink; bool statsUserDownlink;
int bufferSize; int bufferSize;
LevelPolicyObject(): handshake(), connIdle(), uplinkOnly(), downlinkOnly(), statsUserUplink(), statsUserDownlink(), bufferSize() {} LevelPolicyObject(): handshake(), connIdle(), uplinkOnly(), downlinkOnly(), statsUserUplink(), statsUserDownlink(), bufferSize() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(handshake, connIdle, uplinkOnly, downlinkOnly, statsUserUplink, statsUserDownlink, bufferSize)) XTOSTRUCT(O(handshake, connIdle, uplinkOnly, downlinkOnly, statsUserUplink, statsUserDownlink, bufferSize))
#endif
}; };
} }
struct PolicyObject { struct PolicyObject {
map<int, POLICYObjects::LevelPolicyObject> level; map<int, POLICYObjects::LevelPolicyObject> level;
list<POLICYObjects::SystemPolicyObject> system; list<POLICYObjects::SystemPolicyObject> system;
PolicyObject(): level(), system() {} PolicyObject(): level(), system() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(level, system)) XTOSTRUCT(O(level, system))
#endif
}; };
namespace TRANSFERObjects namespace TRANSFERObjects
{ {
@ -152,9 +127,7 @@ namespace Hv2ray
list<string> path; list<string> path;
map<string, list<string>> headers; map<string, list<string>> headers;
HTTPRequestObject(): version(), method(), path(), headers() {} HTTPRequestObject(): version(), method(), path(), headers() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(version, method, path, headers)) XTOSTRUCT(O(version, method, path, headers))
#endif
}; };
struct HTTPResponseObject { struct HTTPResponseObject {
@ -163,18 +136,14 @@ namespace Hv2ray
string reason; string reason;
map<string, list<string>> headers; map<string, list<string>> headers;
HTTPResponseObject(): version(), status(), reason(), headers() {} HTTPResponseObject(): version(), status(), reason(), headers() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(version, status, reason, headers)) XTOSTRUCT(O(version, status, reason, headers))
#endif
}; };
struct TCPHeader_M_Object { struct TCPHeader_M_Object {
string type; string type;
HTTPRequestObject request; HTTPRequestObject request;
HTTPResponseObject response; HTTPResponseObject response;
TCPHeader_M_Object(): type(), request(), response() {} TCPHeader_M_Object(): type(), request(), response() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(type, request, response)) XTOSTRUCT(O(type, request, response))
#endif
}; };
struct HeaderObject { struct HeaderObject {
string type; string type;
@ -189,9 +158,7 @@ namespace Hv2ray
struct TCPObject { struct TCPObject {
TRANSFERObjectsInternal:: TCPHeader_M_Object header; TRANSFERObjectsInternal:: TCPHeader_M_Object header;
TCPObject(): header() {} TCPObject(): header() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(header)) XTOSTRUCT(O(header))
#endif
}; };
@ -205,9 +172,7 @@ namespace Hv2ray
int writeBufferSize; int writeBufferSize;
TRANSFERObjectsInternal:: HeaderObject header; TRANSFERObjectsInternal:: HeaderObject header;
KCPObject(): mtu(), tti(), uplinkCapacity(), downlinkCapacity(), congestion(), readBufferSize(), writeBufferSize(), header() {} KCPObject(): mtu(), tti(), uplinkCapacity(), downlinkCapacity(), congestion(), readBufferSize(), writeBufferSize(), header() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header)) XTOSTRUCT(O(mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header))
#endif
}; };
@ -215,26 +180,20 @@ namespace Hv2ray
string path; string path;
map<string, string> headers; map<string, string> headers;
WebSocketObject(): path(), headers() {} WebSocketObject(): path(), headers() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(path, headers)) XTOSTRUCT(O(path, headers))
#endif
}; };
struct HttpObject { struct HttpObject {
list<string> host; list<string> host;
string path; string path;
HttpObject() : host(), path() {} HttpObject() : host(), path() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(host, path)) XTOSTRUCT(O(host, path))
#endif
}; };
struct DomainSocketObject { struct DomainSocketObject {
string path; string path;
DomainSocketObject(): path() {} DomainSocketObject(): path() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(path)) XTOSTRUCT(O(path))
#endif
}; };
struct QuicObject { struct QuicObject {
@ -242,9 +201,7 @@ namespace Hv2ray
string key; string key;
TRANSFERObjectsInternal::HeaderObject header; TRANSFERObjectsInternal::HeaderObject header;
QuicObject(): security(), key(), header() {} QuicObject(): security(), key(), header() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(security, key, header)) XTOSTRUCT(O(security, key, header))
#endif
}; };
@ -257,9 +214,7 @@ namespace Hv2ray
TRANSFERObjects::DomainSocketObject dsSettings; TRANSFERObjects::DomainSocketObject dsSettings;
TRANSFERObjects::QuicObject quicSettings; TRANSFERObjects::QuicObject quicSettings;
TransportObject(): tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {} TransportObject(): tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings)) XTOSTRUCT(O(tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings))
#endif
}; };
namespace INBOUNDObjects namespace INBOUNDObjects
{ {
@ -268,9 +223,7 @@ namespace Hv2ray
bool enabled; bool enabled;
string destOverride; string destOverride;
SniffingObject(): enabled(), destOverride() {} SniffingObject(): enabled(), destOverride() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(enabled, destOverride)) XTOSTRUCT(O(enabled, destOverride))
#endif
}; };
struct AllocateObject { struct AllocateObject {
@ -278,9 +231,7 @@ namespace Hv2ray
int refresh; int refresh;
int concurrency; int concurrency;
AllocateObject(): strategy(), refresh(), concurrency() {} AllocateObject(): strategy(), refresh(), concurrency() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(strategy, refresh, concurrency)) XTOSTRUCT(O(strategy, refresh, concurrency))
#endif
}; };
} }
namespace STREAMSETTINGSObjects namespace STREAMSETTINGSObjects
@ -290,9 +241,7 @@ namespace Hv2ray
bool tcpFastOpen; bool tcpFastOpen;
string tproxy; string tproxy;
SockoptObject(): mark(), tcpFastOpen(), tproxy() {} SockoptObject(): mark(), tcpFastOpen(), tproxy() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(mark, tcpFastOpen, tproxy)) XTOSTRUCT(O(mark, tcpFastOpen, tproxy))
#endif
}; };
struct CertificateObject { struct CertificateObject {
@ -302,9 +251,7 @@ namespace Hv2ray
list<string> certificate; list<string> certificate;
list<string> key; list<string> key;
CertificateObject(): usage(), certificateFile(), keyFile(), certificate(), key() {} CertificateObject(): usage(), certificateFile(), keyFile(), certificate(), key() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(usage, certificateFile, keyFile, certificate, key)) XTOSTRUCT(O(usage, certificateFile, keyFile, certificate, key))
#endif
}; };
struct TLSObject { struct TLSObject {
@ -314,9 +261,7 @@ namespace Hv2ray
list<CertificateObject> certificates; list<CertificateObject> certificates;
bool disableSystemRoot; bool disableSystemRoot;
TLSObject(): serverName(), allowInsecure(), certificates(), disableSystemRoot() {} TLSObject(): serverName(), allowInsecure(), certificates(), disableSystemRoot() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(serverName, allowInsecure, alpn, certificates, disableSystemRoot)) XTOSTRUCT(O(serverName, allowInsecure, alpn, certificates, disableSystemRoot))
#endif
}; };
} }
@ -332,9 +277,7 @@ namespace Hv2ray
TRANSFERObjects::DomainSocketObject dsSettings; TRANSFERObjects::DomainSocketObject dsSettings;
TRANSFERObjects::QuicObject quicSettings; TRANSFERObjects::QuicObject quicSettings;
StreamSettingsObject(): network(), security(), sockopt(), tlsSettings(), tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {} StreamSettingsObject(): network(), security(), sockopt(), tlsSettings(), tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(network, security, sockopt, tcpSettings, tlsSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings)) XTOSTRUCT(O(network, security, sockopt, tcpSettings, tlsSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings))
#endif
}; };
template<typename XINBOUNDSETTINGOBJECT> template<typename XINBOUNDSETTINGOBJECT>
@ -349,9 +292,7 @@ namespace Hv2ray
INBOUNDObjects::SniffingObject sniffing; INBOUNDObjects::SniffingObject sniffing;
INBOUNDObjects::AllocateObject allocate; INBOUNDObjects::AllocateObject allocate;
InboundObject(): port(), listen(), protocol(), settings(), streamSettings(), tag(), sniffing(), allocate() {} InboundObject(): port(), listen(), protocol(), settings(), streamSettings(), tag(), sniffing(), allocate() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(port, listen, protocol, settings, streamSettings, tag, sniffing, allocate)) XTOSTRUCT(O(port, listen, protocol, settings, streamSettings, tag, sniffing, allocate))
#endif
}; };
namespace OUTBOUNDObjects namespace OUTBOUNDObjects
{ {
@ -359,18 +300,14 @@ namespace Hv2ray
struct ProxySettingsObject { struct ProxySettingsObject {
string tag; string tag;
ProxySettingsObject(): tag() {} ProxySettingsObject(): tag() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(tag)) XTOSTRUCT(O(tag))
#endif
}; };
struct MuxObject { struct MuxObject {
bool enabled; bool enabled;
int concurrency; int concurrency;
MuxObject(): enabled(), concurrency() {} MuxObject(): enabled(), concurrency() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(enabled, concurrency)) XTOSTRUCT(O(enabled, concurrency))
#endif
}; };
} }
template <typename XOUTBOUNDSETTINGOBJECT> template <typename XOUTBOUNDSETTINGOBJECT>
@ -384,17 +321,13 @@ namespace Hv2ray
OUTBOUNDObjects::ProxySettingsObject proxySettings; OUTBOUNDObjects::ProxySettingsObject proxySettings;
OUTBOUNDObjects::MuxObject mux; OUTBOUNDObjects::MuxObject mux;
OutboundObject(): sendThrough(), protocol(), settings(), tag(), streamSettings(), proxySettings(), mux() {} OutboundObject(): sendThrough(), protocol(), settings(), tag(), streamSettings(), proxySettings(), mux() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(sendThrough, protocol, settings, tag, streamSettings, proxySettings, mux)) XTOSTRUCT(O(sendThrough, protocol, settings, tag, streamSettings, proxySettings, mux))
#endif
}; };
struct StatsObject { struct StatsObject {
bool _; // Placeholder... bool _; // Placeholder...
StatsObject(): _() {} StatsObject(): _() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(_)) XTOSTRUCT(O(_))
#endif
}; };
namespace REVERSEObjects namespace REVERSEObjects
{ {
@ -403,18 +336,14 @@ namespace Hv2ray
string tag; string tag;
string domain; string domain;
BridgeObject() : tag(), domain() {} BridgeObject() : tag(), domain() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(tag, domain)) XTOSTRUCT(O(tag, domain))
#endif
}; };
struct PortalObject { struct PortalObject {
string tag; string tag;
string domain; string domain;
PortalObject() : tag(), domain() {} PortalObject() : tag(), domain() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(tag, domain)) XTOSTRUCT(O(tag, domain))
#endif
}; };
} }
@ -422,9 +351,7 @@ namespace Hv2ray
list<REVERSEObjects::BridgeObject> bridges; list<REVERSEObjects::BridgeObject> bridges;
list<REVERSEObjects::PortalObject> portals; list<REVERSEObjects::PortalObject> portals;
ReverseObject() : bridges(), portals() {} ReverseObject() : bridges(), portals() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(bridges, portals)) XTOSTRUCT(O(bridges, portals))
#endif
}; };
#if USE_TODO_FEATURES #if USE_TODO_FEATURES
template<typename XIN1, typename XIN2, typename XIN3, typename XIN4, typename XIN5, typename XOUT1, typename XOUT2, typename XOUT3, typename XOUT4, typename XOUT5> template<typename XIN1, typename XIN2, typename XIN3, typename XIN4, typename XIN5, typename XOUT1, typename XOUT2, typename XOUT3, typename XOUT4, typename XOUT5>
@ -449,14 +376,12 @@ namespace Hv2ray
ReverseObject reverse; ReverseObject reverse;
PolicyObject policy; PolicyObject policy;
RootObject(): log(), api(), dns(), routing(), inbounds(), outbounds(), transport(), stats(), reverse(), policy() {} RootObject(): log(), api(), dns(), routing(), inbounds(), outbounds(), transport(), stats(), reverse(), policy() {}
#if USE_TODO_FEATURES == false
XTOSTRUCT(O(log, api, dns, routing, inbounds, outbounds, transport, stats, reverse, policy)) XTOSTRUCT(O(log, api, dns, routing, inbounds, outbounds, transport, stats, reverse, policy))
#endif
}; };
} }
} }
namespace Hv2ray namespace Qv2ray
{ {
namespace V2ConfigModels namespace V2ConfigModels
{ {
@ -572,61 +497,8 @@ namespace Hv2ray
} }
} }
#if USE_TODO_FEATURES
using namespace Hv2ray;
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::LogObject, access, error, loglevel)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ApiObject, tag, services)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::DNSObjects::ServerObject, address, port, domains)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::DnsObject, hosts, servers)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ROUTINGObjects::RuleObject, type, domain, ip, port, network, source, user, inboundTag, protocol, attrs)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ROUTINGObjects::BalancerObject, tag, selector)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::RoutingObject, domainStrategy, rules, balancers)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::POLICYObjects::SystemPolicyObject, statsInboundUplink, statsInboundDownlink)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::POLICYObjects::LevelPolicyObject, handshake, connIdle, uplinkOnly, downlinkOnly, statsUserUplink, statsUserDownlink, bufferSize)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::PolicyObject, level, system)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::HTTPRequestObject, version, method, path, headers)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::HTTPResponseObject, version, status, reason, headers)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::TCPHeader_M_Object, type, request, response)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::HeaderObject, type)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TCPObject, header)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::KCPObject, mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::WebSocketObject, path, headers)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::HttpObject, host, path)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::DomainSocketObject, path)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::QuicObject, security, key, header)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TransportObject, tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::INBOUNDObjects::SniffingObject, enabled, destOverride)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::INBOUNDObjects::AllocateObject, strategy, refresh, concurrency)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::OUTBOUNDObjects::ProxySettingsObject, tag)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::OUTBOUNDObjects::MuxObject, enabled, concurrency)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::REVERSEObjects::BridgeObject, tag, domain)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::REVERSEObjects::PortalObject, tag, domain)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ReverseObject, bridges, portals)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::StatsObject, _)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::StreamSettingsObject, tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings, tlsSettings, sockopt, network, security)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::STREAMSETTINGSObjects::TLSObject, serverName, allowInsecure, alpn, certificates, disableSystemRoot)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::STREAMSETTINGSObjects::CertificateObject, usage, certificateFile, keyFile, certificate, key)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::STREAMSETTINGSObjects::SockoptObject, mark, tcpFastOpen, tproxy)
// These 3 are used as templates.
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::RootObject, log, api, dns, routing, inbounds, outbounds, transport, stats, reverse, policy)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::InboundObject, port, listen, protocol, settings, streamSettings, tag, sniffing, allocate)
JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::OutboundObject, sendThrough, protocol, settings, tag, streamSettings, proxySettings, mux)
#endif
/// Code above has passed these tests. /// Code above has passed these tests.
//using namespace Hv2ray::V2ConfigModels; //using namespace Qv2ray::V2ConfigModels;
//RootObject<Protocols::HTTP, Protocols::VMess> x; //RootObject<Protocols::HTTP, Protocols::VMess> x;
//InboundObject<Protocols::HTTP> inH; //InboundObject<Protocols::HTTP> inH;
//x.inbounds.insert(x.inbounds.end(), inH); //x.inbounds.insert(x.inbounds.end(), inH);

View File

@ -10,24 +10,24 @@
#include "w_MainWindow.h" #include "w_MainWindow.h"
using namespace std; using namespace std;
using namespace Hv2ray; using namespace Qv2ray;
using namespace Hv2ray::Utils; using namespace Qv2ray::Utils;
using namespace Hv2ray::HConfigModels; using namespace Qv2ray::QvConfigModels;
bool initializeHv() bool initializeHv()
{ {
/// Hv2ray Config Path and ends with "/" /// Qv2ray Config Path and ends with "/"
QString configPath = ""; QString configPath = "";
#if defined(__WIN32) || defined(__APPLE__) #if defined(__WIN32) || defined(__APPLE__)
// For Windows and MacOS, there's no such 'installation' of a software // For Windows and MacOS, there's no such 'installation' of a software
// package, So as what ShadowSocks and v2rayX does, save config files next to // package, So as what ShadowSocks and v2rayX does, save config files next to
// the executable. // the executable.
configPath = HV2RAY_CONFIG_DIR_NAME; configPath = QV2RAY_CONFIG_DIR_NAME;
#else #else
// However, for linux, this software can be and/or will be provided as a // However, for linux, this software can be and/or will be provided as a
// package and install to whatever /usr/bin or /usr/local/bin or even /opt/ // package and install to whatever /usr/bin or /usr/local/bin or even /opt/
// Thus we save config files in the user's home directory. // Thus we save config files in the user's home directory.
configPath = QDir::homePath() + HV2RAY_CONFIG_DIR_NAME; configPath = QDir::homePath() + QV2RAY_CONFIG_DIR_NAME;
#endif #endif
ConfigDir = QDir(configPath); ConfigDir = QDir(configPath);
@ -35,7 +35,7 @@ bool initializeHv()
auto result = QDir().mkdir(configPath); auto result = QDir().mkdir(configPath);
if (result) { if (result) {
qDebug() << "Created hv2ray config file path at: " + configPath; qDebug() << "Created Qv2ray config file path at: " + configPath;
} else { } else {
// We cannot continue as it failed to create a dir. // We cannot continue as it failed to create a dir.
qDebug() << "Failed to create config file folder under " + configPath; qDebug() << "Failed to create config file folder under " + configPath;
@ -43,14 +43,14 @@ bool initializeHv()
} }
} }
QFile configFile(configPath + "hv2ray.conf"); QFile configFile(configPath + "Qv2ray.conf");
if (!Utils::hasFile(&ConfigDir, ".initialised")) { if (!Utils::hasFile(&ConfigDir, ".initialised")) {
// This is first run! // This is first run!
// These below genenrated very basic global config. // These below genenrated very basic global config.
HInbondSetting inHttp = HInbondSetting(true, "127.0.0.1", 8080); QvInbondSetting inHttp = QvInbondSetting(true, "127.0.0.1", 8080);
HInbondSetting inSocks = HInbondSetting(true, "127.0.0.1", 1080); QvInbondSetting inSocks = QvInbondSetting(true, "127.0.0.1", 1080);
Hv2Config conf = Hv2Config("zh-CN", "info", inHttp, inSocks); Qv2Config conf = Qv2Config("zh-CN", "info", inHttp, inSocks);
SetGlobalConfig(conf); SetGlobalConfig(conf);
SaveConfig(&configFile); SaveConfig(&configFile);
// Create Placeholder for initialise indicator. // Create Placeholder for initialise indicator.
@ -67,17 +67,17 @@ bool initializeHv()
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication _qApp(argc, argv); QApplication _qApp(argc, argv);
RunGuard guard("Hv2ray-Instance-Identifier"); RunGuard guard("Qv2ray-Instance-Identifier");
if (!guard.isSingleInstance()) { if (!guard.isSingleInstance()) {
Utils::showWarnMessageBox(nullptr, QObject::tr("Hv2Ray"), QObject::tr("AnotherInstanceRunning")); Utils::showWarnMessageBox(nullptr, QObject::tr("Qv2ray"), QObject::tr("AnotherInstanceRunning"));
return -1; return -1;
} }
// Set file startup path as Path // Set file startup path as Path
// WARNING: This may be changed in the future. // WARNING: This may be changed in the future.
QDir::setCurrent(QFileInfo(QCoreApplication::applicationFilePath()).path()); QDir::setCurrent(QFileInfo(QCoreApplication::applicationFilePath()).path());
// Hv2ray Initialize // Qv2ray Initialize
initializeHv(); initializeHv();
if (_qApp.installTranslator(getTranslator(GetGlobalConfig().language))) { if (_qApp.installTranslator(getTranslator(GetGlobalConfig().language))) {
@ -92,7 +92,7 @@ int main(int argc, char *argv[])
} }
// Show MainWindow // Show MainWindow
Ui::MainWindow w; Ui_Impl::MainWindow w;
w.show(); w.show();
return _qApp.exec(); return _qApp.exec();
} }

View File

@ -1,7 +1,7 @@
#include <QCryptographicHash> #include <QCryptographicHash>
#include "runguard.hpp" #include "runguard.hpp"
namespace Hv2ray namespace Qv2ray
{ {
//from https://stackoverflow.com/a/28172162 //from https://stackoverflow.com/a/28172162

View File

@ -5,7 +5,7 @@
#include <QSharedMemory> #include <QSharedMemory>
#include <QSystemSemaphore> #include <QSystemSemaphore>
namespace Hv2ray namespace Qv2ray
{ {
// From https://stackoverflow.com/a/28172162 // From https://stackoverflow.com/a/28172162
class RunGuard class RunGuard

View File

@ -6,7 +6,7 @@
#include "vinteract.hpp" #include "vinteract.hpp"
#include "w_MainWindow.h" #include "w_MainWindow.h"
namespace Hv2ray namespace Qv2ray
{ {
bool v2Instance::checkConfigFile(const QString path) bool v2Instance::checkConfigFile(const QString path)
{ {

View File

@ -3,7 +3,7 @@
#include <QProcess> #include <QProcess>
#include <QString> #include <QString>
namespace Hv2ray namespace Qv2ray
{ {
enum V2RAY_INSTANCE_STARTUP_STATUS { enum V2RAY_INSTANCE_STARTUP_STATUS {
STOPPED, STOPPED,

View File

@ -5,9 +5,9 @@
#include <QIntValidator> #include <QIntValidator>
#include <iostream> #include <iostream>
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
ConnectionEditWindow::ConnectionEditWindow(QWidget *parent) ConnectionEditWindow::ConnectionEditWindow(QWidget *parent)
: QDialog(parent) : QDialog(parent)

View File

@ -4,9 +4,9 @@
#include <QDialog> #include <QDialog>
#include "ui_w_ConnectionEditWindow.h" #include "ui_w_ConnectionEditWindow.h"
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
class ConnectionEditWindow : public QDialog class ConnectionEditWindow : public QDialog
{ {

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>Hv2ray::Ui::ConnectionEditWindow</class> <class>ConnectionEditWindow</class>
<widget class="QDialog" name="Hv2ray::Ui::ConnectionEditWindow"> <widget class="QDialog" name="ConnectionEditWindow">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -864,7 +864,7 @@
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
<signal>accepted()</signal> <signal>accepted()</signal>
<receiver>Hv2ray::Ui::ConnectionEditWindow</receiver> <receiver>ConnectionEditWindow</receiver>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
@ -880,7 +880,7 @@
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
<signal>rejected()</signal> <signal>rejected()</signal>
<receiver>Hv2ray::Ui::ConnectionEditWindow</receiver> <receiver>ConnectionEditWindow</receiver>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">

View File

@ -15,10 +15,10 @@
#include "w_ConnectionEditWindow.h" #include "w_ConnectionEditWindow.h"
#include "w_ImportConfig.h" #include "w_ImportConfig.h"
using namespace Hv2ray; using namespace Qv2ray;
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
ImportConfig::ImportConfig(QWidget *parent) ImportConfig::ImportConfig(QWidget *parent)
: QDialog(parent) : QDialog(parent)

View File

@ -4,9 +4,9 @@
#include <QDialog> #include <QDialog>
#include "ui_w_ImportConfig.h" #include "ui_w_ImportConfig.h"
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
class ImportConfig : public QDialog class ImportConfig : public QDialog
{ {

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>Hv2ray::Ui::ImportConfig</class> <class>ImportConfig</class>
<widget class="QDialog" name="Hv2ray::Ui::ImportConfig"> <widget class="QDialog" name="ImportConfig">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -162,7 +162,7 @@
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
<signal>accepted()</signal> <signal>accepted()</signal>
<receiver>Hv2ray::Ui::ImportConfig</receiver> <receiver>ImportConfig</receiver>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
@ -178,7 +178,7 @@
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
<signal>rejected()</signal> <signal>rejected()</signal>
<receiver>Hv2ray::Ui::ImportConfig</receiver> <receiver>ImportConfig</receiver>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">

View File

@ -15,14 +15,14 @@
#include "w_MainWindow.h" #include "w_MainWindow.h"
#include "w_PrefrencesWindow.h" #include "w_PrefrencesWindow.h"
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
void MainWindow::CreateTrayIcon() void MainWindow::CreateTrayIcon()
{ {
hTray = new QSystemTrayIcon(); hTray = new QSystemTrayIcon();
hTray->setToolTip(tr("Hv2ray")); hTray->setToolTip(tr("Qv2ray"));
hTray->setIcon(this->windowIcon()); hTray->setIcon(this->windowIcon());
connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason))); connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason)));
QAction *actionShow = new QAction(this); QAction *actionShow = new QAction(this);
@ -58,7 +58,7 @@ namespace Hv2ray
: QMainWindow(parent) : QMainWindow(parent)
, ui(new Ui_MainWindow) , ui(new Ui_MainWindow)
{ {
this->setWindowIcon(QIcon(":/icons/Hv2ray.ico")); this->setWindowIcon(QIcon(":/icons/Qv2ray.ico"));
ui->setupUi(this); ui->setupUi(this);
UpdateConfigTable(); UpdateConfigTable();
// ui->configTable->setContextMenuPolicy(Qt::CustomContextMenu); // ui->configTable->setContextMenuPolicy(Qt::CustomContextMenu);

View File

@ -10,9 +10,9 @@
#include "vinteract.hpp" #include "vinteract.hpp"
#include "V2ConfigObjects.hpp" #include "V2ConfigObjects.hpp"
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
class MainWindow : public QMainWindow class MainWindow : public QMainWindow
{ {

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>Hv2ray::Ui::MainWindow</class> <class>MainWindow</class>
<widget class="QMainWindow" name="Hv2ray::Ui::MainWindow"> <widget class="QMainWindow" name="MainWindow">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Hv2ray</string> <string>Qv2ray</string>
</property> </property>
<widget class="QWidget" name="centralWidget"> <widget class="QWidget" name="centralWidget">
<property name="sizePolicy"> <property name="sizePolicy">

View File

@ -16,12 +16,12 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
using namespace Hv2ray; using namespace Qv2ray;
using namespace Utils; using namespace Utils;
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent), CurrentConfig(), ui(new Ui_PrefrencesWindow) PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent), CurrentConfig(), ui(new Ui_PrefrencesWindow)
{ {

View File

@ -5,9 +5,9 @@
#include <ui_w_PrefrencesWindow.h> #include <ui_w_PrefrencesWindow.h>
#include "HConfigObjects.hpp" #include "HConfigObjects.hpp"
namespace Hv2ray namespace Qv2ray
{ {
namespace Ui namespace Ui_Impl
{ {
class PrefrencesWindow : public QDialog class PrefrencesWindow : public QDialog
{ {
@ -28,7 +28,7 @@ namespace Hv2ray
void on_runAsRootCheckBox_stateChanged(int arg1); void on_runAsRootCheckBox_stateChanged(int arg1);
private: private:
Hv2ray::HConfigModels::Hv2Config CurrentConfig; Qv2ray::QvConfigModels::Qv2Config CurrentConfig;
Ui_PrefrencesWindow *ui; Ui_PrefrencesWindow *ui;
}; };
} }

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>Hv2ray::Ui::PrefrencesWindow</class> <class>PrefrencesWindow</class>
<widget class="QDialog" name="Hv2ray::Ui::PrefrencesWindow"> <widget class="QDialog" name="PrefrencesWindow">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -345,7 +345,7 @@
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
<signal>accepted()</signal> <signal>accepted()</signal>
<receiver>Hv2ray::Ui::PrefrencesWindow</receiver> <receiver>PrefrencesWindow</receiver>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
@ -361,7 +361,7 @@
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
<signal>rejected()</signal> <signal>rejected()</signal>
<receiver>Hv2ray::Ui::PrefrencesWindow</receiver> <receiver>PrefrencesWindow</receiver>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">

View File

@ -3,197 +3,6 @@
<TS version="2.1" language="en_US"> <TS version="2.1" language="en_US">
<context> <context>
<name>ConnectionEditWindow</name> <name>ConnectionEditWindow</name>
<message>
<source>#ConnectionSettings</source>
<translation type="vanished">Connection Settings</translation>
</message>
<message>
<source>#Host</source>
<translation type="vanished">Host</translation>
</message>
<message>
<source>#Port</source>
<translation type="vanished">Port</translation>
</message>
<message>
<source>#Name</source>
<translation type="vanished">Name</translation>
</message>
<message>
<source>#UUID</source>
<translation type="vanished">UUID</translation>
</message>
<message>
<source>#AlterID</source>
<translation type="vanished">Alter ID</translation>
</message>
<message>
<source>#Security</source>
<translation type="vanished">Security Settings</translation>
</message>
<message>
<source>auto</source>
<translation type="vanished">Auto</translation>
</message>
<message>
<source>aes-128-gcm</source>
<translation type="vanished">aes-128-gcm</translation>
</message>
<message>
<source>chacha20-poly1305</source>
<translation type="vanished">chacha20-poly1305</translation>
</message>
<message>
<source>none</source>
<translation type="vanished">Do not use</translation>
</message>
<message>
<source>#Transport</source>
<translation type="vanished">Transport Settings</translation>
</message>
<message>
<source>tcp (TCP)</source>
<translation type="vanished">tcp (TCP)</translation>
</message>
<message>
<source>http (HTTP)</source>
<translation type="vanished">http (HTTP)</translation>
</message>
<message>
<source>ws (WebSocket)</source>
<translation type="vanished">ws (WebSocket)</translation>
</message>
<message>
<source>kcp (mKCP)</source>
<translation type="vanished">kcp (mKCP)</translation>
</message>
<message>
<source>domainsocket (Domain Socket)</source>
<translation type="vanished">domainsocket (Domain Socket)</translation>
</message>
<message>
<source>quic (Quick UDP Internet Connection)</source>
<translation type="vanished">quic (Quick UDP Internet Connection)</translation>
</message>
<message>
<source>#TransportSettings</source>
<translation type="vanished">Transport Settings</translation>
</message>
<message>
<source>TCP</source>
<translation type="vanished">TCP</translation>
</message>
<message>
<source>http</source>
<translation type="vanished">HTTP</translation>
</message>
<message>
<source>#Type</source>
<translation type="vanished">Type</translation>
</message>
<message>
<source>#Request</source>
<translation type="vanished">Request</translation>
</message>
<message>
<source>#InsertDefaultContent</source>
<translation type="vanished">Insert Default Content</translation>
</message>
<message>
<source>#Response</source>
<translation type="vanished">Response</translation>
</message>
<message>
<source>HTTP</source>
<translation type="vanished">HTTP</translation>
</message>
<message>
<source>#Path</source>
<translation type="vanished">Path</translation>
</message>
<message>
<source>WebSocket</source>
<translation type="vanished">WebSocket</translation>
</message>
<message>
<source>#Headers</source>
<translation type="vanished">Headers</translation>
</message>
<message>
<source>mKCP</source>
<translation type="vanished">mKCP</translation>
</message>
<message>
<source>#MTU</source>
<translation type="vanished">MTU</translation>
</message>
<message>
<source>#TTI (ms)</source>
<translation type="vanished">TTI (ms)</translation>
</message>
<message>
<source>#UplinkCapacity (MB/s)</source>
<translation type="vanished">Uplink Capacity (MB/s)</translation>
</message>
<message>
<source>#Congestion</source>
<translation type="vanished">Congestion Control</translation>
</message>
<message>
<source>#Enabled</source>
<translation type="vanished">Enabled</translation>
</message>
<message>
<source>#DownlinkCapacity (MB/s)</source>
<translation type="vanished">Downlink Capacity (MB/s)</translation>
</message>
<message>
<source>#ReadBufferSize (MB)</source>
<translation type="vanished">Read Buffer Size (MB)</translation>
</message>
<message>
<source>#WriteBufferSize (MB)</source>
<translation type="vanished">Write Buffer Size (MB)</translation>
</message>
<message>
<source>#Header</source>
<translation type="vanished">Headers</translation>
</message>
<message>
<source>srtp (SRTP, FaceTime)</source>
<translation type="vanished">srtp (SRTP, FaceTime)</translation>
</message>
<message>
<source>utp (BitTorrent)</source>
<translation type="vanished">utp (BitTorrent)</translation>
</message>
<message>
<source>wechat-video (WeChat Video Message)</source>
<translation type="vanished">wechat-video (WeChat Video Message)</translation>
</message>
<message>
<source>dtls (DTLS 1.2)</source>
<translation type="vanished">dtls (DTLS 1.2)</translation>
</message>
<message>
<source>wireguard (WireGuard fake packets)</source>
<translation type="vanished">wireguard (WireGuard fake packets)</translation>
</message>
<message>
<source>DomainSocket</source>
<translation type="vanished">DomainSocket</translation>
</message>
<message>
<source>QUIC</source>
<translation type="vanished">QUIC</translation>
</message>
<message>
<source>#Key</source>
<translation type="vanished">Key</translation>
</message>
</context>
<context>
<name>Hv2ray::Ui::ConnectionEditWindow</name>
<message> <message>
<location filename="../src/w_ConnectionEditWindow.ui" line="20"/> <location filename="../src/w_ConnectionEditWindow.ui" line="20"/>
<source>#ConnectionSettings</source> <source>#ConnectionSettings</source>
@ -451,7 +260,7 @@
</message> </message>
</context> </context>
<context> <context>
<name>Hv2ray::Ui::ImportConfig</name> <name>ImportConfig</name>
<message> <message>
<location filename="../src/w_ImportConfig.ui" line="20"/> <location filename="../src/w_ImportConfig.ui" line="20"/>
<source>Import file</source> <source>Import file</source>
@ -517,45 +326,26 @@
<source>#VMess Connection String</source> <source>#VMess Connection String</source>
<translation>VMess Connection String</translation> <translation>VMess Connection String</translation>
</message> </message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="38"/>
<source>OpenConfigFile</source>
<translation>Open Config File</translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>ImportConfig</source>
<translation>Import Config</translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>CannotGenerateConfig</source>
<translation>Failed to generate config file</translation>
</message>
</context> </context>
<context> <context>
<name>Hv2ray::Ui::MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="26"/> <location filename="../src/w_MainWindow.ui" line="26"/>
<location filename="../src/w_MainWindow.cpp" line="25"/> <source>Qv2ray</source>
<source>Hv2ray</source> <translation></translation>
<translation>Hv2ray</translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="46"/> <location filename="../src/w_MainWindow.ui" line="46"/>
<location filename="../src/w_MainWindow.cpp" line="35"/>
<source>#Start</source> <source>#Start</source>
<translation>Start</translation> <translation>Start</translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="53"/> <location filename="../src/w_MainWindow.ui" line="53"/>
<location filename="../src/w_MainWindow.cpp" line="36"/>
<source>#Stop</source> <source>#Stop</source>
<translation>Stop</translation> <translation>Stop</translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="60"/> <location filename="../src/w_MainWindow.ui" line="60"/>
<location filename="../src/w_MainWindow.cpp" line="37"/>
<source>#Restart</source> <source>#Restart</source>
<translation>Restart</translation> <translation>Restart</translation>
</message> </message>
@ -595,7 +385,7 @@
<translation>Transport Settings</translation> <translation>Transport Settings</translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="214"/> <location filename="../src/w_MainWindow.ui" line="208"/>
<location filename="../src/w_MainWindow.ui" line="221"/> <location filename="../src/w_MainWindow.ui" line="221"/>
<source>#ConnectionSettings</source> <source>#ConnectionSettings</source>
<translation>Connection Settings</translation> <translation>Connection Settings</translation>
@ -630,29 +420,11 @@
<source>#Preferences</source> <source>#Preferences</source>
<translation>Preferences</translation> <translation>Preferences</translation>
</message> </message>
<message>
<location filename="../src/w_MainWindow.cpp" line="33"/>
<location filename="../src/w_MainWindow.cpp" line="236"/>
<source>#Hide</source>
<translation>Hide</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="34"/>
<source>#Quit</source>
<translation>Quit</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="239"/>
<source>#Show</source>
<translation>Show</translation>
</message>
</context> </context>
<context> <context>
<name>Hv2ray::Ui::PrefrencesWindow</name> <name>PrefrencesWindow</name>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="20"/> <location filename="../src/w_PrefrencesWindow.ui" line="20"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="66"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="99"/>
<source>Prefrences</source> <source>Prefrences</source>
<translation>Preferences</translation> <translation>Preferences</translation>
</message> </message>
@ -737,11 +509,6 @@
<source>#InboundSettings</source> <source>#InboundSettings</source>
<translation>Inbound Settings</translation> <translation>Inbound Settings</translation>
</message> </message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="177"/>
<source>HTTP</source>
<translation>HTTP</translation>
</message>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="193"/> <location filename="../src/w_PrefrencesWindow.ui" line="193"/>
<location filename="../src/w_PrefrencesWindow.ui" line="256"/> <location filename="../src/w_PrefrencesWindow.ui" line="256"/>
@ -771,311 +538,33 @@
<source>#Password</source> <source>#Password</source>
<translation>Password</translation> <translation>Password</translation>
</message> </message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="250"/>
<source>SOCKS</source>
<translation>SOCKS</translation>
</message>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="263"/> <location filename="../src/w_PrefrencesWindow.ui" line="263"/>
<source>9001</source> <source>9001</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>#Prefrences</source> <location filename="../src/w_PrefrencesWindow.ui" line="177"/>
<translation type="obsolete">Preferences</translation>
</message>
<message>
<source>#CannotOpenConfigFile</source>
<translation type="obsolete">Cannot open config file</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="66"/>
<source>PortNumbersCannotBeSame</source>
<translation>Port numbers cannot be the same</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="99"/>
<source>RunAsRootNotOnWindows</source>
<translation>Run as root is not avaliable on Windows Platform</translation>
</message>
</context>
<context>
<name>ImportConfig</name>
<message>
<source>Import file</source>
<translation type="vanished">Import file</translation>
</message>
<message>
<source>#ImportFrom</source>
<translation type="vanished">Import From</translation>
</message>
<message>
<source>Existing File</source>
<translation type="vanished">Existing File</translation>
</message>
<message>
<source>VMess Connection String</source>
<translation type="vanished">VMess Connection String</translation>
</message>
<message>
<source>#FromFile</source>
<translation type="vanished">From file</translation>
</message>
<message>
<source>#Path</source>
<translation type="vanished">Path</translation>
</message>
<message>
<source>#SelectFile</source>
<translation type="vanished">Select File</translation>
</message>
<message>
<source>#Name</source>
<translation type="vanished">Name</translation>
</message>
<message>
<source>#Inbound</source>
<translation type="vanished">Inbound Settings</translation>
</message>
<message>
<source>#UseCurrent</source>
<translation type="vanished">Use Current Settings</translation>
</message>
<message>
<source>#UseImported</source>
<translation type="vanished">Use Imported Inbound Settings</translation>
</message>
<message>
<source>#From VMess Connection String</source>
<translation type="vanished">From VMess Connection String</translation>
</message>
<message>
<source>#VMess Connection String</source>
<translation type="vanished">VMess Connection String</translation>
</message>
<message>
<source>OpenConfigFile</source>
<translation type="vanished">Open Config File</translation>
</message>
<message>
<source>ImportConfig</source>
<translation type="vanished">Import Config</translation>
</message>
<message>
<source>CannotOpenFile</source>
<translation type="vanished">Cannot open file</translation>
</message>
<message>
<source>SaveFailed</source>
<translation type="vanished">Failed to save</translation>
</message>
<message>
<source>CannotCopyCustomConfig</source>
<translation type="vanished">Failed to copy config file</translation>
</message>
<message>
<source>CannotGenerateConfig</source>
<translation type="vanished">Failed to generate config file</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Hv2ray</source>
<translation type="vanished">Hv2ray</translation>
</message>
<message>
<source>#Start</source>
<translation type="vanished">Start</translation>
</message>
<message>
<source>#Stop</source>
<translation type="vanished">Stop</translation>
</message>
<message>
<source>#Restart</source>
<translation type="vanished">Restart</translation>
</message>
<message>
<source>#ClearLog</source>
<translation type="vanished">Clear Log</translation>
</message>
<message>
<source>#HostList</source>
<translation type="vanished">Host List</translation>
</message>
<message>
<source>#ConfigDetail</source>
<translation type="vanished">Detailed Config Info</translation>
</message>
<message>
<source>#Host</source>
<translation type="vanished">Host</translation>
</message>
<message>
<source>#Port</source>
<translation type="vanished">Port</translation>
</message>
<message>
<source>#UUID</source>
<translation type="vanished">UUID</translation>
</message>
<message>
<source>#Transport</source>
<translation type="vanished">Transport Settings</translation>
</message>
<message>
<source>#ConnectionSettings</source>
<translation type="vanished">Connection Settings</translation>
</message>
<message>
<source>#File</source>
<translation type="vanished">File</translation>
</message>
<message>
<source>#NewConnection</source>
<translation type="vanished">New Connection</translation>
</message>
<message>
<source>#ManuallyInput</source>
<translation type="vanished">Manually Input Config</translation>
</message>
<message>
<source>#ImportConnection</source>
<translation type="vanished">Import Config File</translation>
</message>
<message>
<source>#Exit</source>
<translation type="vanished">Exit</translation>
</message>
<message>
<source>#Preferences</source>
<translation type="vanished">Preferences</translation>
</message>
<message>
<source>#Hide</source>
<translation type="vanished">Hide</translation>
</message>
<message>
<source>#Quit</source>
<translation type="vanished">Quit</translation>
</message>
<message>
<source>#Show</source>
<translation type="vanished">Show</translation>
</message>
</context>
<context>
<name>PrefrencesWindow</name>
<message>
<source>Prefrences</source>
<translation type="vanished">Preferences</translation>
</message>
<message>
<source>#General</source>
<translation type="vanished">General</translation>
</message>
<message>
<source>#Language</source>
<translation type="vanished">Language</translation>
</message>
<message>
<source>#RunAsRoot</source>
<translation type="vanished">Run v2ray as root</translation>
</message>
<message>
<source>#Enabled</source>
<translation type="vanished">Enabled</translation>
</message>
<message>
<source>#LogLevel</source>
<translation type="vanished">Log Level</translation>
</message>
<message>
<source>debug</source>
<translation type="vanished">Debug</translation>
</message>
<message>
<source>info</source>
<translation type="vanished">Info</translation>
</message>
<message>
<source>warning</source>
<translation type="vanished">Warning</translation>
</message>
<message>
<source>error</source>
<translation type="vanished">Error</translation>
</message>
<message>
<source>none</source>
<translation type="vanished">Do not use</translation>
</message>
<message>
<source>#MuxCool</source>
<translation type="vanished">Mux Settings</translation>
</message>
<message>
<source>#Concurrency</source>
<translation type="vanished">Maximum Connections</translation>
</message>
<message>
<source>#InboundSettings</source>
<translation type="vanished">Inbound Settings</translation>
</message>
<message>
<source>#Port</source>
<translation type="vanished">Port</translation>
</message>
<message>
<source>#Username</source>
<translation type="vanished">Username</translation>
</message>
<message>
<source>#Auth</source>
<translation type="vanished">Authentication</translation>
</message>
<message>
<source>#Password</source>
<translation type="vanished">Password</translation>
</message>
<message>
<source>HTTP</source> <source>HTTP</source>
<translation type="vanished">HTTP</translation> <translation>HTTP</translation>
</message> </message>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="250"/>
<source>SOCKS</source> <source>SOCKS</source>
<translation type="vanished">SOCKS</translation> <translation>SOCKS</translation>
</message>
<message>
<source>#Prefrences</source>
<translation type="vanished">Preferences</translation>
</message>
<message>
<source>#CannotOpenConfigFile</source>
<translation type="vanished">Cannot open config file</translation>
</message>
<message>
<source>PortNumbersCannotBeSame</source>
<translation type="vanished">Port numbers cannot be the same</translation>
</message>
<message>
<source>RunAsRootNotOnWindows</source>
<translation type="vanished">Run as root is not avaliable on Windows Platform</translation>
</message> </message>
</context> </context>
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/main.cpp" line="73"/> <location filename="../src/main.cpp" line="73"/>
<source>Hv2Ray</source> <source>AnotherInstanceRunning</source>
<translation>Hv2ray</translation> <translation>Another instance is already running</translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="73"/> <location filename="../src/main.cpp" line="73"/>
<source>AnotherInstanceRunning</source> <source>Qv2ray</source>
<translation>Another instance is already running</translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/vinteract.cpp" line="51"/> <location filename="../src/vinteract.cpp" line="51"/>
@ -1093,4 +582,80 @@
<translation>Configuration Error</translation> <translation>Configuration Error</translation>
</message> </message>
</context> </context>
<context>
<name>Qv2ray::Ui_Impl::ImportConfig</name>
<message>
<location filename="../src/w_ImportConfig.cpp" line="38"/>
<source>OpenConfigFile</source>
<translation>Open Config File</translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>ImportConfig</source>
<translation>Import Config</translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>CannotGenerateConfig</source>
<translation>Failed to generate config file</translation>
</message>
</context>
<context>
<name>Qv2ray::Ui_Impl::MainWindow</name>
<message>
<location filename="../src/w_MainWindow.cpp" line="25"/>
<source>Qv2ray</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="33"/>
<location filename="../src/w_MainWindow.cpp" line="236"/>
<source>#Hide</source>
<translation>Hide</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="34"/>
<source>#Quit</source>
<translation>Quit</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="35"/>
<source>#Start</source>
<translation>Start</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="36"/>
<source>#Stop</source>
<translation>Stop</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="37"/>
<source>#Restart</source>
<translation>Restart</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="239"/>
<source>#Show</source>
<translation>Show</translation>
</message>
</context>
<context>
<name>Qv2ray::Ui_Impl::PrefrencesWindow</name>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="82"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="115"/>
<source>Prefrences</source>
<translation>Preferences</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="82"/>
<source>PortNumbersCannotBeSame</source>
<translation>Port numbers cannot be the same</translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="115"/>
<source>RunAsRootNotOnWindows</source>
<translation>Run as root is not avaliable on Windows Platform</translation>
</message>
</context>
</TS> </TS>

View File

@ -3,197 +3,6 @@
<TS version="2.1" language="zh_CN"> <TS version="2.1" language="zh_CN">
<context> <context>
<name>ConnectionEditWindow</name> <name>ConnectionEditWindow</name>
<message>
<source>#ConnectionSettings</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Host</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Port</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Name</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#UUID</source>
<translation type="vanished">UUID</translation>
</message>
<message>
<source>#AlterID</source>
<translation type="vanished">Alter ID</translation>
</message>
<message>
<source>#Security</source>
<translation type="vanished"></translation>
</message>
<message>
<source>auto</source>
<translation type="vanished"></translation>
</message>
<message>
<source>aes-128-gcm</source>
<translation type="vanished">aes-128-gcm</translation>
</message>
<message>
<source>chacha20-poly1305</source>
<translation type="vanished">chacha20-poly1305</translation>
</message>
<message>
<source>none</source>
<translation type="vanished">使</translation>
</message>
<message>
<source>#Transport</source>
<translation type="vanished"></translation>
</message>
<message>
<source>tcp (TCP)</source>
<translation type="vanished">tcp (TCP)</translation>
</message>
<message>
<source>http (HTTP)</source>
<translation type="vanished">http (HTTP)</translation>
</message>
<message>
<source>ws (WebSocket)</source>
<translation type="vanished">ws (WebSocket)</translation>
</message>
<message>
<source>kcp (mKCP)</source>
<translation type="vanished">kcp (mKCP)</translation>
</message>
<message>
<source>domainsocket (Domain Socket)</source>
<translation type="vanished">domainsocket (Domain Socket)</translation>
</message>
<message>
<source>quic (Quick UDP Internet Connection)</source>
<translation type="vanished">quic (Quick UDP Internet Connection)</translation>
</message>
<message>
<source>#TransportSettings</source>
<translation type="vanished"></translation>
</message>
<message>
<source>TCP</source>
<translation type="vanished">TCP</translation>
</message>
<message>
<source>http</source>
<translation type="vanished">HTTP</translation>
</message>
<message>
<source>#Type</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Request</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#InsertDefaultContent</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Response</source>
<translation type="vanished"></translation>
</message>
<message>
<source>HTTP</source>
<translation type="vanished">HTTP</translation>
</message>
<message>
<source>#Path</source>
<translation type="vanished"></translation>
</message>
<message>
<source>WebSocket</source>
<translation type="vanished">WebSocket</translation>
</message>
<message>
<source>#Headers</source>
<translation type="vanished"></translation>
</message>
<message>
<source>mKCP</source>
<translation type="vanished">mKCP</translation>
</message>
<message>
<source>#MTU</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#TTI (ms)</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#UplinkCapacity (MB/s)</source>
<translation type="vanished"> (MB/s)</translation>
</message>
<message>
<source>#Congestion</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Enabled</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#DownlinkCapacity (MB/s)</source>
<translation type="vanished"> (MB/s)</translation>
</message>
<message>
<source>#ReadBufferSize (MB)</source>
<translation type="vanished"> (MB)</translation>
</message>
<message>
<source>#WriteBufferSize (MB)</source>
<translation type="vanished"> (MB)</translation>
</message>
<message>
<source>#Header</source>
<translation type="vanished"></translation>
</message>
<message>
<source>srtp (SRTP, FaceTime)</source>
<translation type="vanished">srtp (SRTP, FaceTime)</translation>
</message>
<message>
<source>utp (BitTorrent)</source>
<translation type="vanished">utp (BitTorrent)</translation>
</message>
<message>
<source>wechat-video (WeChat Video Message)</source>
<translation type="vanished">wechat-video (WeChat Video Message)</translation>
</message>
<message>
<source>dtls (DTLS 1.2)</source>
<translation type="vanished">dtls (DTLS 1.2)</translation>
</message>
<message>
<source>wireguard (WireGuard fake packets)</source>
<translation type="vanished">wireguard (WireGuard fake packets)</translation>
</message>
<message>
<source>DomainSocket</source>
<translation type="vanished">DomainSocket</translation>
</message>
<message>
<source>QUIC</source>
<translation type="vanished">QUIC</translation>
</message>
<message>
<source>#Key</source>
<translation type="vanished"></translation>
</message>
</context>
<context>
<name>Hv2ray::Ui::ConnectionEditWindow</name>
<message> <message>
<location filename="../src/w_ConnectionEditWindow.ui" line="20"/> <location filename="../src/w_ConnectionEditWindow.ui" line="20"/>
<source>#ConnectionSettings</source> <source>#ConnectionSettings</source>
@ -451,7 +260,7 @@
</message> </message>
</context> </context>
<context> <context>
<name>Hv2ray::Ui::ImportConfig</name> <name>ImportConfig</name>
<message> <message>
<location filename="../src/w_ImportConfig.ui" line="20"/> <location filename="../src/w_ImportConfig.ui" line="20"/>
<source>Import file</source> <source>Import file</source>
@ -517,45 +326,26 @@
<source>#VMess Connection String</source> <source>#VMess Connection String</source>
<translation>VMess </translation> <translation>VMess </translation>
</message> </message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="38"/>
<source>OpenConfigFile</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>ImportConfig</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>CannotGenerateConfig</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>Hv2ray::Ui::MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="26"/> <location filename="../src/w_MainWindow.ui" line="26"/>
<location filename="../src/w_MainWindow.cpp" line="25"/> <source>Qv2ray</source>
<source>Hv2ray</source> <translation></translation>
<translation>Hv2ray</translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="46"/> <location filename="../src/w_MainWindow.ui" line="46"/>
<location filename="../src/w_MainWindow.cpp" line="35"/>
<source>#Start</source> <source>#Start</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="53"/> <location filename="../src/w_MainWindow.ui" line="53"/>
<location filename="../src/w_MainWindow.cpp" line="36"/>
<source>#Stop</source> <source>#Stop</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="60"/> <location filename="../src/w_MainWindow.ui" line="60"/>
<location filename="../src/w_MainWindow.cpp" line="37"/>
<source>#Restart</source> <source>#Restart</source>
<translation></translation> <translation></translation>
</message> </message>
@ -595,7 +385,7 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/w_MainWindow.ui" line="214"/> <location filename="../src/w_MainWindow.ui" line="208"/>
<location filename="../src/w_MainWindow.ui" line="221"/> <location filename="../src/w_MainWindow.ui" line="221"/>
<source>#ConnectionSettings</source> <source>#ConnectionSettings</source>
<translation></translation> <translation></translation>
@ -630,29 +420,11 @@
<source>#Preferences</source> <source>#Preferences</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../src/w_MainWindow.cpp" line="33"/>
<location filename="../src/w_MainWindow.cpp" line="236"/>
<source>#Hide</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="34"/>
<source>#Quit</source>
<translation>退</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="239"/>
<source>#Show</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>Hv2ray::Ui::PrefrencesWindow</name> <name>PrefrencesWindow</name>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="20"/> <location filename="../src/w_PrefrencesWindow.ui" line="20"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="66"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="99"/>
<source>Prefrences</source> <source>Prefrences</source>
<translation></translation> <translation></translation>
</message> </message>
@ -737,11 +509,6 @@
<source>#InboundSettings</source> <source>#InboundSettings</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="177"/>
<source>HTTP</source>
<translation>HTTP</translation>
</message>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="193"/> <location filename="../src/w_PrefrencesWindow.ui" line="193"/>
<location filename="../src/w_PrefrencesWindow.ui" line="256"/> <location filename="../src/w_PrefrencesWindow.ui" line="256"/>
@ -771,311 +538,33 @@
<source>#Password</source> <source>#Password</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../src/w_PrefrencesWindow.ui" line="250"/>
<source>SOCKS</source>
<translation>SOCKS</translation>
</message>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="263"/> <location filename="../src/w_PrefrencesWindow.ui" line="263"/>
<source>9001</source> <source>9001</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>#Prefrences</source> <location filename="../src/w_PrefrencesWindow.ui" line="177"/>
<translation type="obsolete"></translation>
</message>
<message>
<source>#CannotOpenConfigFile</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="66"/>
<source>PortNumbersCannotBeSame</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="99"/>
<source>RunAsRootNotOnWindows</source>
<translation>Windows </translation>
</message>
</context>
<context>
<name>ImportConfig</name>
<message>
<source>Import file</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#ImportFrom</source>
<translation type="vanished"></translation>
</message>
<message>
<source>Existing File</source>
<translation type="vanished"></translation>
</message>
<message>
<source>VMess Connection String</source>
<translation type="vanished">VMess </translation>
</message>
<message>
<source>#FromFile</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Path</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#SelectFile</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Name</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Inbound</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#UseCurrent</source>
<translation type="vanished">使</translation>
</message>
<message>
<source>#UseImported</source>
<translation type="vanished">使</translation>
</message>
<message>
<source>#From VMess Connection String</source>
<translation type="vanished"> VMess </translation>
</message>
<message>
<source>#VMess Connection String</source>
<translation type="vanished">VMess </translation>
</message>
<message>
<source>OpenConfigFile</source>
<translation type="vanished"></translation>
</message>
<message>
<source>ImportConfig</source>
<translation type="vanished"></translation>
</message>
<message>
<source>CannotOpenFile</source>
<translation type="vanished"></translation>
</message>
<message>
<source>SaveFailed</source>
<translation type="vanished"></translation>
</message>
<message>
<source>CannotCopyCustomConfig</source>
<translation type="vanished"></translation>
</message>
<message>
<source>CannotGenerateConfig</source>
<translation type="vanished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Hv2ray</source>
<translation type="vanished">Hv2ray</translation>
</message>
<message>
<source>#Start</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Stop</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Restart</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#ClearLog</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#HostList</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#ConfigDetail</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Host</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Port</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#UUID</source>
<translation type="vanished">UUID</translation>
</message>
<message>
<source>#Transport</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#ConnectionSettings</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#File</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#NewConnection</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#ManuallyInput</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#ImportConnection</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Exit</source>
<translation type="vanished">退</translation>
</message>
<message>
<source>#Preferences</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Hide</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Quit</source>
<translation type="vanished">退</translation>
</message>
<message>
<source>#Show</source>
<translation type="vanished"></translation>
</message>
</context>
<context>
<name>PrefrencesWindow</name>
<message>
<source>Prefrences</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#General</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Language</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#RunAsRoot</source>
<translation type="vanished">使 root </translation>
</message>
<message>
<source>#Enabled</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#LogLevel</source>
<translation type="vanished"></translation>
</message>
<message>
<source>debug</source>
<translation type="vanished"></translation>
</message>
<message>
<source>info</source>
<translation type="vanished"></translation>
</message>
<message>
<source>warning</source>
<translation type="vanished"></translation>
</message>
<message>
<source>error</source>
<translation type="vanished"></translation>
</message>
<message>
<source>none</source>
<translation type="vanished">使</translation>
</message>
<message>
<source>#MuxCool</source>
<translation type="vanished">Mux </translation>
</message>
<message>
<source>#Concurrency</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#InboundSettings</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Port</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Username</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Auth</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#Password</source>
<translation type="vanished"></translation>
</message>
<message>
<source>HTTP</source> <source>HTTP</source>
<translation type="vanished">HTTP</translation> <translation>HTTP</translation>
</message> </message>
<message> <message>
<location filename="../src/w_PrefrencesWindow.ui" line="250"/>
<source>SOCKS</source> <source>SOCKS</source>
<translation type="vanished">SOCKS</translation> <translation>SOCKS</translation>
</message>
<message>
<source>#Prefrences</source>
<translation type="vanished"></translation>
</message>
<message>
<source>#CannotOpenConfigFile</source>
<translation type="vanished"></translation>
</message>
<message>
<source>PortNumbersCannotBeSame</source>
<translation type="vanished"></translation>
</message>
<message>
<source>RunAsRootNotOnWindows</source>
<translation type="vanished">Windows </translation>
</message> </message>
</context> </context>
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/main.cpp" line="73"/> <location filename="../src/main.cpp" line="73"/>
<source>Hv2Ray</source> <source>AnotherInstanceRunning</source>
<translation>Hv2ray</translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="73"/> <location filename="../src/main.cpp" line="73"/>
<source>AnotherInstanceRunning</source> <source>Qv2ray</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/vinteract.cpp" line="51"/> <location filename="../src/vinteract.cpp" line="51"/>
@ -1093,4 +582,80 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>Qv2ray::Ui_Impl::ImportConfig</name>
<message>
<location filename="../src/w_ImportConfig.cpp" line="38"/>
<source>OpenConfigFile</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>ImportConfig</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_ImportConfig.cpp" line="125"/>
<source>CannotGenerateConfig</source>
<translation></translation>
</message>
</context>
<context>
<name>Qv2ray::Ui_Impl::MainWindow</name>
<message>
<location filename="../src/w_MainWindow.cpp" line="25"/>
<source>Qv2ray</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="33"/>
<location filename="../src/w_MainWindow.cpp" line="236"/>
<source>#Hide</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="34"/>
<source>#Quit</source>
<translation>退</translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="35"/>
<source>#Start</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="36"/>
<source>#Stop</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="37"/>
<source>#Restart</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_MainWindow.cpp" line="239"/>
<source>#Show</source>
<translation></translation>
</message>
</context>
<context>
<name>Qv2ray::Ui_Impl::PrefrencesWindow</name>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="82"/>
<location filename="../src/w_PrefrencesWindow.cpp" line="115"/>
<source>Prefrences</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="82"/>
<source>PortNumbersCannotBeSame</source>
<translation></translation>
</message>
<message>
<location filename="../src/w_PrefrencesWindow.cpp" line="115"/>
<source>RunAsRootNotOnWindows</source>
<translation>Windows </translation>
</message>
</context>
</TS> </TS>