[Added] Added UI Translations

Signed-off-by: Leroy.H.Y <lhy20010403@hotmail.com>

Former-commit-id: 688071dd00
This commit is contained in:
Leroy.H.Y 2019-06-23 19:19:20 +08:00
parent 7c46831ec6
commit 787773635e
19 changed files with 1035 additions and 918 deletions

View File

@ -24,8 +24,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11 CONFIG += c++11
VPATH += ./src \ VPATH += ./src
./translations
SOURCES += \ SOURCES += \
main.cpp \ main.cpp \
@ -52,15 +51,21 @@ FORMS += \
ImportConfig.ui \ ImportConfig.ui \
PrefrencesWindow.ui PrefrencesWindow.ui
TRANSLATIONS += ./translations/zh-CN.ts RESOURCES += \
resources.qrc
TRANSLATIONS += \
./translations/zh-CN.ts \
./translations/en-US.ts
RC_ICONS += ./icons/Hv2ray.ico
# Default rules for deployment. # Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target !isEmpty(target.path): INSTALLS += target
RC_ICONS = Himeki.ico
WITH_PYTHON = no WITH_PYTHON = no
unix: exists( "/usr/include/python3.7m/Python.h" ) { unix: exists( "/usr/include/python3.7m/Python.h" ) {

View File

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 264 KiB

7
resources.qrc Normal file
View File

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

View File

@ -19,12 +19,12 @@ ConnectionEditWindow::~ConnectionEditWindow()
{ {
delete ui; delete ui;
} }
int vConfig::save() int Hv2Config::save()
{ {
return -1; return -1;
} }
void vConfig::getConfigFromDialog(Ui::ConnectionEditWindow *ui) void Hv2Config::getConfigFromDialog(Ui::ConnectionEditWindow *ui)
{ {
this->host = ui->ipLineEdit->text(); this->host = ui->ipLineEdit->text();
this->port = ui->portLineEdit->text(); this->port = ui->portLineEdit->text();

View File

@ -8,7 +8,7 @@ namespace Ui
class ConnectionEditWindow; class ConnectionEditWindow;
} }
class vConfig class Hv2Config
{ {
public: public:
QString host; QString host;

View File

@ -17,7 +17,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Connection Settings</string> <string>#ConnectionSettings</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,3"> <layout class="QGridLayout" name="gridLayout" columnstretch="0,3">
<item row="0" column="0"> <item row="0" column="0">
@ -25,7 +25,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="ipLabel"> <widget class="QLabel" name="ipLabel">
<property name="text"> <property name="text">
<string>Host</string> <string>#Host</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -39,7 +39,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="portLabel"> <widget class="QLabel" name="portLabel">
<property name="text"> <property name="text">
<string>Port</string> <string>#Port</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -53,7 +53,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="aliasLabel"> <widget class="QLabel" name="aliasLabel">
<property name="text"> <property name="text">
<string>Name</string> <string>#Name</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -70,7 +70,7 @@
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="idLabel"> <widget class="QLabel" name="idLabel">
<property name="text"> <property name="text">
<string>UUID</string> <string>#UUID</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -87,7 +87,7 @@
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="alterLabel"> <widget class="QLabel" name="alterLabel">
<property name="text"> <property name="text">
<string>Alter ID</string> <string>#AlterID</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -101,7 +101,7 @@
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="securityLabel"> <widget class="QLabel" name="securityLabel">
<property name="text"> <property name="text">
<string>Security</string> <string>#Security</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -132,7 +132,7 @@
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="transportLabel"> <widget class="QLabel" name="transportLabel">
<property name="text"> <property name="text">
<string>Transport</string> <string>#Transport</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -172,13 +172,26 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser"/>
</item>
<item row="2" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="2"> <item row="0" column="1" rowspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LeftToRight</enum>
</property> </property>
<property name="title"> <property name="title">
<string>Transport Settings (StreamSettingsObject)</string> <string>#TransportSettings</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
@ -202,7 +215,7 @@
</size> </size>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>5</number> <number>0</number>
</property> </property>
<property name="usesScrollButtons"> <property name="usesScrollButtons">
<bool>true</bool> <bool>true</bool>
@ -225,7 +238,7 @@
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>http (HttpHeaderobject)</string> <string>http</string>
</property> </property>
</item> </item>
</widget> </widget>
@ -233,7 +246,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>type</string> <string>#Type</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -246,7 +259,7 @@
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Request (HTTPRequestObject)</string> <string>#Request</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -256,28 +269,20 @@
<enum>QPlainTextEdit::NoWrap</enum> <enum>QPlainTextEdit::NoWrap</enum>
</property> </property>
<property name="plainText"> <property name="plainText">
<string>{ <string/>
&quot;version&quot;: &quot;1.1&quot;,
&quot;method&quot;: &quot;GET&quot;,
&quot;path&quot;: [&quot;/&quot;],
&quot;headers&quot;: {
&quot;Host&quot;: [&quot;www.baidu.com&quot;, &quot;www.bing.com&quot;],
&quot;User-Agent&quot;: [
&quot;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36&quot;,
&quot;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&quot;
],
&quot;Accept-Encoding&quot;: [&quot;gzip, deflate&quot;],
&quot;Connection&quot;: [&quot;keep-alive&quot;],
&quot;Pragma&quot;: &quot;no-cache&quot;
}
}
</string>
</property> </property>
<property name="backgroundVisible"> <property name="backgroundVisible">
<bool>false</bool> <bool>false</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>#InsertDefaultContent</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -285,7 +290,7 @@
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Response (HTTPResponseObject)</string> <string>#Response</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -295,17 +300,14 @@
<enum>QPlainTextEdit::NoWrap</enum> <enum>QPlainTextEdit::NoWrap</enum>
</property> </property>
<property name="plainText"> <property name="plainText">
<string>{ <string/>
&quot;version&quot;: &quot;1.1&quot;, </property>
&quot;status&quot;: &quot;200&quot;, </widget>
&quot;reason&quot;: &quot;OK&quot;, </item>
&quot;headers&quot;: { <item>
&quot;Content-Type&quot;: [&quot;application/octet-stream&quot;, &quot;video/mpeg&quot;], <widget class="QPushButton" name="pushButton_2">
&quot;Transfer-Encoding&quot;: [&quot;chunked&quot;], <property name="text">
&quot;Connection&quot;: [&quot;keep-alive&quot;], <string>#InsertDefaultContent</string>
&quot;Pragma&quot;: &quot;no-cache&quot;
}
}</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -325,32 +327,26 @@
<item row="0" column="0"> <item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_5" columnstretch="1,1"> <layout class="QGridLayout" name="gridLayout_5" columnstretch="1,1">
<item row="1" column="0"> <item row="1" column="0">
<widget class="QListWidget" name="listWidget"> <widget class="QListWidget" name="listWidget"/>
<item>
<property name="text">
<string>v2ray.com</string>
</property>
</item>
</widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>host</string> <string>#Host</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>path</string> <string>#Path</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QPlainTextEdit" name="plainTextEdit_3"> <widget class="QPlainTextEdit" name="plainTextEdit_3">
<property name="plainText"> <property name="plainText">
<string>/</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
@ -370,14 +366,14 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>path</string> <string>#Path</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLineEdit" name="lineEdit"> <widget class="QLineEdit" name="lineEdit">
<property name="text"> <property name="text">
<string>/</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
@ -386,7 +382,7 @@
<item> <item>
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="text"> <property name="text">
<string>headers (Key Value Pair)</string> <string>#Headers</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -418,11 +414,6 @@
<property name="currentRow"> <property name="currentRow">
<number>-1</number> <number>-1</number>
</property> </property>
<item>
<property name="text">
<string>Host</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item> <item>
@ -436,11 +427,6 @@
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set> <set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
</property> </property>
<item>
<property name="text">
<string>v2ray.com</string>
</property>
</item>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -459,7 +445,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
<property name="text"> <property name="text">
<string>MTU</string> <string>#MTU</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -485,7 +471,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_10"> <widget class="QLabel" name="label_10">
<property name="text"> <property name="text">
<string>TTI (ms)</string> <string>#TTI (ms)</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -511,7 +497,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
<string>UplinkCapacity (MB/s)</string> <string>#UplinkCapacity (MB/s)</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -534,14 +520,14 @@
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_15"> <widget class="QLabel" name="label_15">
<property name="text"> <property name="text">
<string>Congestion</string> <string>#Congestion</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QCheckBox" name="checkBox"> <widget class="QCheckBox" name="checkBox">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -552,7 +538,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="text"> <property name="text">
<string>downlinkCapacity (MB/s)</string> <string>#DownlinkCapacity (MB/s)</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -575,7 +561,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_11"> <widget class="QLabel" name="label_11">
<property name="text"> <property name="text">
<string>readBufferSize (MB)</string> <string>#ReadBufferSize (MB)</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -598,7 +584,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_13"> <widget class="QLabel" name="label_13">
<property name="text"> <property name="text">
<string>writeBufferSize (MB)</string> <string>#WriteBufferSize (MB)</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -623,13 +609,13 @@
<item row="1" column="0" colspan="2"> <item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>header (Header Object)</string> <string>#Header</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_16"> <widget class="QLabel" name="label_16">
<property name="text"> <property name="text">
<string>type</string> <string>#Type</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -688,14 +674,14 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_17"> <widget class="QLabel" name="label_17">
<property name="text"> <property name="text">
<string>path</string> <string>#Path</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_2"> <widget class="QLineEdit" name="lineEdit_2">
<property name="text"> <property name="text">
<string>/path/to/ds/file</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
@ -713,7 +699,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_18"> <widget class="QLabel" name="label_18">
<property name="text"> <property name="text">
<string>security</string> <string>#Security</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -745,21 +731,21 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_19"> <widget class="QLabel" name="label_19">
<property name="text"> <property name="text">
<string>key</string> <string>#Key</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLineEdit" name="lineEdit_3"> <widget class="QLineEdit" name="lineEdit_3">
<property name="text"> <property name="text">
<string>xxxxx</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_20"> <widget class="QLabel" name="label_20">
<property name="text"> <property name="text">
<string>header</string> <string>#Headers</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -772,7 +758,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="title"> <property name="title">
<string>header (HeaderObject)</string> <string>#Header</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_11"> <layout class="QVBoxLayout" name="verticalLayout_11">
<item> <item>
@ -780,7 +766,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_21"> <widget class="QLabel" name="label_21">
<property name="text"> <property name="text">
<string>type</string> <string>#Type</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -838,21 +824,41 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser"/>
</item>
<item row="2" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>ipLineEdit</tabstop>
<tabstop>portLineEdit</tabstop>
<tabstop>aliasLineEdit</tabstop>
<tabstop>idLineEdit</tabstop>
<tabstop>alterLineEdit</tabstop>
<tabstop>securityCombo</tabstop>
<tabstop>tranportCombo</tabstop>
<tabstop>tabWidget</tabstop>
<tabstop>comboBox</tabstop>
<tabstop>plainTextEdit</tabstop>
<tabstop>pushButton</tabstop>
<tabstop>plainTextEdit_2</tabstop>
<tabstop>pushButton_2</tabstop>
<tabstop>listWidget</tabstop>
<tabstop>plainTextEdit_3</tabstop>
<tabstop>lineEdit</tabstop>
<tabstop>listWidget_3</tabstop>
<tabstop>listWidget_2</tabstop>
<tabstop>spinBox</tabstop>
<tabstop>spinBox_3</tabstop>
<tabstop>spinBox_5</tabstop>
<tabstop>checkBox</tabstop>
<tabstop>spinBox_2</tabstop>
<tabstop>spinBox_4</tabstop>
<tabstop>spinBox_6</tabstop>
<tabstop>comboBox_2</tabstop>
<tabstop>lineEdit_2</tabstop>
<tabstop>comboBox_3</tabstop>
<tabstop>lineEdit_3</tabstop>
<tabstop>comboBox_4</tabstop>
<tabstop>textBrowser</tabstop>
</tabstops>
<resources/> <resources/>
<connections> <connections>
<connection> <connection>

View File

@ -31,17 +31,18 @@ ImportConfig::~ImportConfig()
void ImportConfig::on_pushButton_clicked() void ImportConfig::on_pushButton_clicked()
{ {
QString dir = QFileDialog::getOpenFileName(this, tr("Open Config File"), "~/"); QString dir = QFileDialog::getOpenFileName(this, tr("OpenConfigFile"), "~/");
ui->fileLineTxt->setText(dir); ui->fileLineTxt->setText(dir);
} }
void ImportConfig::savefromFile(QString path, QString alias) void ImportConfig::savefromFile(QString path, QString alias)
{ {
vConfig newConf; Hv2Config newConfig;
newConf.alias = alias; newConfig.alias = alias;
QFile configFile(path); QFile configFile(path);
if(!configFile.open(QIODevice::ReadOnly)) { if(!configFile.open(QIODevice::ReadOnly)) {
qDebug() << "Couldn't open config json"; showWarnMessageBox(this, tr("ImportConfig"), tr("CannotOpenFile"));
qDebug() << "ImportConfig::CannotOpenFile";
return; return;
} }
QByteArray allData = configFile.readAll(); QByteArray allData = configFile.readAll();
@ -56,25 +57,27 @@ void ImportConfig::savefromFile(QString path, QString alias)
} }
QJsonObject vnext = switchJsonArrayObject(outbound.value("settings").toObject(), "vnext"); QJsonObject vnext = switchJsonArrayObject(outbound.value("settings").toObject(), "vnext");
QJsonObject user = switchJsonArrayObject(vnext, "users"); QJsonObject user = switchJsonArrayObject(vnext, "users");
newConf.host = vnext.value("address").toString(); newConfig.host = vnext.value("address").toString();
newConf.port = QString::number(vnext.value("port").toInt()); newConfig.port = QString::number(vnext.value("port").toInt());
newConf.alterid = QString::number(user.value("alterId").toInt()); newConfig.alterid = QString::number(user.value("alterId").toInt());
newConf.uuid = user.value("id").toString(); newConfig.uuid = user.value("id").toString();
newConf.security = user.value("security").toString(); newConfig.security = user.value("security").toString();
if (newConf.security.isNull()) { if (newConfig.security.isNull()) {
newConf.security = "auto"; newConfig.security = "auto";
} }
newConf.isCustom = 1; newConfig.isCustom = 1;
int id = newConf.save(); int id = newConfig.save();
if(id < 0) if(id < 0)
{ {
showWarnMessageBox(this, "Database Error", "Failed to open database while saving"); showWarnMessageBox(this, tr("ImportConfig"), tr("SaveFailed"));
qDebug() << "ImportConfig::SaveFailed";
return; return;
} }
emit updateConfTable(); emit updateConfTable();
QString newFile = "conf/" + QString::number(id) + ".conf"; QString newFile = "conf/" + QString::number(id) + ".conf";
if(!QFile::copy(path, newFile)) { if(!QFile::copy(path, newFile)) {
showWarnMessageBox(this, "Copy error", "Failed to copy custom config file."); showWarnMessageBox(this, tr("ImportConfig"), tr("CannotCopyCustomConfig"));
qDebug() << "ImportConfig::CannotCopyCustomConfig";
} }
} }
@ -93,9 +96,7 @@ void ImportConfig::on_buttonBox_accepted()
{ {
QString vmess = ui->vmessConnectionStringTxt->toPlainText(); QString vmess = ui->vmessConnectionStringTxt->toPlainText();
Py_Initialize(); Py_Initialize();
if ( !Py_IsInitialized() ) { assert(Py_IsInitialized());
qDebug() << "Python is not initialized";
}
QString param = "--inbound socks:1080 " + vmess + " -o config.json.tmp"; QString param = "--inbound socks:1080 " + vmess + " -o config.json.tmp";
PyRun_SimpleString("import sys"); PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./utils')"); PyRun_SimpleString("sys.path.append('./utils')");
@ -113,7 +114,8 @@ void ImportConfig::on_buttonBox_accepted()
} }
QFile::remove("config.json.tmp"); QFile::remove("config.json.tmp");
} else { } else {
showWarnMessageBox(this, "Error occured", "Failed to generate config file."); showWarnMessageBox(this, tr("ImportConfig"), tr("CannotGenerateConfig"));
qDebug() << "ImportConfig::CannotGenerateConfig";
} }
} }

View File

@ -25,7 +25,7 @@
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Import From</string> <string>#ImportFrom</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -48,13 +48,13 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="fromFileGroupBox"> <widget class="QGroupBox" name="fromFileGroupBox">
<property name="title"> <property name="title">
<string>From File</string> <string>#FromFile</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="fileLabel"> <widget class="QLabel" name="fileLabel">
<property name="text"> <property name="text">
<string>Path</string> <string>#Path</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -70,7 +70,7 @@
<item> <item>
<widget class="QPushButton" name="selectFileBtn"> <widget class="QPushButton" name="selectFileBtn">
<property name="text"> <property name="text">
<string>Select File</string> <string>#SelectFile</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -79,7 +79,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="aliasLabel"> <widget class="QLabel" name="aliasLabel">
<property name="text"> <property name="text">
<string>Name</string> <string>#Name</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -89,7 +89,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Inbound</string> <string>#Inbound</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -98,7 +98,7 @@
<item> <item>
<widget class="QRadioButton" name="useCurrentSettingRidBtn"> <widget class="QRadioButton" name="useCurrentSettingRidBtn">
<property name="text"> <property name="text">
<string>Use Current</string> <string>#UseCurrent</string>
</property> </property>
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>
@ -108,7 +108,7 @@
<item> <item>
<widget class="QRadioButton" name="useImportedRidBtn"> <widget class="QRadioButton" name="useImportedRidBtn">
<property name="text"> <property name="text">
<string>Use Imported</string> <string>#UseImported</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -120,13 +120,13 @@
<item row="1" column="1"> <item row="1" column="1">
<widget class="QGroupBox" name="fromVMessGroupBox"> <widget class="QGroupBox" name="fromVMessGroupBox">
<property name="title"> <property name="title">
<string>From VMess Connection String</string> <string>#From VMess Connection String</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>VMess Connection String</string> <string>#VMess Connection String</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -148,6 +148,15 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>importSourceCombo</tabstop>
<tabstop>fileLineTxt</tabstop>
<tabstop>selectFileBtn</tabstop>
<tabstop>nameTxt</tabstop>
<tabstop>useCurrentSettingRidBtn</tabstop>
<tabstop>useImportedRidBtn</tabstop>
<tabstop>vmessConnectionStringTxt</tabstop>
</tabstops>
<resources/> <resources/>
<connections> <connections>
<connection> <connection>

View File

@ -8,29 +8,61 @@
#include <QFileInfo> #include <QFileInfo>
#include <QInputDialog> #include <QInputDialog>
#include "ui_MainWindow.h"
#include "PrefrencesWindow.h" #include "PrefrencesWindow.h"
#include "MainWindow.h" #include "MainWindow.h"
#include <ui_MainWindow.h>
#include "ConnectionEditWindow.h" #include "ConnectionEditWindow.h"
#include "ImportConfig.h" #include "ImportConfig.h"
#include "vinteract.h" #include "vinteract.h"
#include "utils.h" #include "utils.h"
void MainWindow::CreateTrayIcon()
{
hTray = new QSystemTrayIcon();
hTray->setToolTip(tr("Hv2ray"));
hTray->setIcon(this->windowIcon());
connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason)));
QAction *actionShow = new QAction(this);
QAction *actionQuit = new QAction(this);
QAction *actionStart = new QAction(this);
QAction *actionRestart = new QAction(this);
QAction *actionStop = new QAction(this);
actionShow->setText(tr("#Hide"));
actionQuit->setText(tr("#Quit"));
actionStart->setText(tr("#Start"));
actionStop->setText(tr("#Stop"));
actionRestart->setText(tr("#Restart"));
actionStart->setEnabled(true);
actionStop->setEnabled(false);
actionRestart->setEnabled(false);
trayMenu->addAction(actionShow);
trayMenu->addSeparator();
trayMenu->addAction(actionStart);
trayMenu->addAction(actionStop);
trayMenu->addAction(actionRestart);
trayMenu->addSeparator();
trayMenu->addAction(actionQuit);
connect(actionShow, SIGNAL(triggered()), this, SLOT(toggleMainWindowVisibility()));
connect(actionStart, SIGNAL(triggered()), this, SLOT(on_startButton_clicked()));
connect(actionStop, SIGNAL(triggered()), this, SLOT(on_stopButton_clicked()));
connect(actionRestart, SIGNAL(triggered()), this, SLOT(on_restartButton_clicked()));
connect(actionQuit, SIGNAL(triggered()), this, SLOT(quit()));
hTray->setContextMenu(trayMenu);
hTray->show();
}
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::MainWindow) ui(new Ui::MainWindow)
{ {
this->setWindowIcon(QIcon("Himeki.ico")); this->setWindowIcon(QIcon(":/icons/Hv2ray.ico"));
ui->setupUi(this); ui->setupUi(this);
UpdateConfigTable(); UpdateConfigTable();
// ui->configTable->setContextMenuPolicy(Qt::CustomContextMenu); // ui->configTable->setContextMenuPolicy(Qt::CustomContextMenu);
// connect(ui->configTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint))); // connect(ui->configTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint)));
this->v2instance = new v2Instance(); this->v2instance = new v2Instance();
hTray = new QSystemTrayIcon(); CreateTrayIcon();
hTray->setToolTip("Hv2ray");
hTray->setIcon(QIcon("Himeki.ico"));
connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason)));
createTrayAction();
if(QFileInfo("config.json").exists()) { if(QFileInfo("config.json").exists()) {
v2instance->start(this); v2instance->start(this);
} }
@ -50,8 +82,10 @@ MainWindow::MainWindow(QWidget *parent) :
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete ui; hTray->hide();
delete this->hTray;
delete this->v2instance; delete this->v2instance;
delete ui;
} }
void MainWindow::on_actionEdit_triggered() void MainWindow::on_actionEdit_triggered()
@ -95,7 +129,7 @@ void MainWindow::UpdateConfigTable()
} }
void MainWindow::GenerateConfig(int idIntable) void MainWindow::GenerateConfig(int idIntable)
{ {
vConfig tmpConf; Hv2Config tmpConf;
emit UpdateConfigTable(); emit UpdateConfigTable();
if (tmpConf.isCustom == 1) { if (tmpConf.isCustom == 1) {
QString src = "conf/" + QString::number(idIntable) + ".conf"; QString src = "conf/" + QString::number(idIntable) + ".conf";
@ -153,37 +187,6 @@ void MainWindow::closeEvent(QCloseEvent *event)
event->ignore(); event->ignore();
} }
void MainWindow::createTrayAction()
{
QAction *actionShow = new QAction(this);
QAction *actionQuit = new QAction(this);
QAction *actionStart = new QAction(this);
QAction *actionRestart = new QAction(this);
QAction *actionStop = new QAction(this);
actionShow->setText("Hide");
actionQuit->setText("Quit Hv2ray");
actionStart->setText("Start v2ray");
actionStop->setText("Stop v2ray");
actionRestart->setText("Restart v2ray");
actionStart->setEnabled(true);
actionStop->setEnabled(false);
actionRestart->setEnabled(false);
trayMenu->addAction(actionShow);
trayMenu->addSeparator();
trayMenu->addAction(actionStart);
trayMenu->addAction(actionStop);
trayMenu->addAction(actionRestart);
trayMenu->addSeparator();
trayMenu->addAction(actionQuit);
connect(actionShow, SIGNAL(triggered()), this, SLOT(toggleMainWindowVisibility()));
connect(actionStart, SIGNAL(triggered()), this, SLOT(on_startButton_clicked()));
connect(actionStop, SIGNAL(triggered()), this, SLOT(on_stopButton_clicked()));
connect(actionRestart, SIGNAL(triggered()), this, SLOT(on_restartButton_clicked()));
connect(actionQuit, SIGNAL(triggered()), this, SLOT(quit()));
hTray->setContextMenu(trayMenu);
hTray->show();
}
void MainWindow::on_activatedTray(QSystemTrayIcon::ActivationReason reason) void MainWindow::on_activatedTray(QSystemTrayIcon::ActivationReason reason)
{ {
switch (reason) { switch (reason) {
@ -216,10 +219,10 @@ void MainWindow::toggleMainWindowVisibility()
{ {
if(this->isHidden()) { if(this->isHidden()) {
this->show(); this->show();
trayMenu->actions()[0]->setText("Hide"); trayMenu->actions()[0]->setText(tr("#Hide"));
} else { } else {
this->hide(); this->hide();
trayMenu->actions()[0]->setText("Show"); trayMenu->actions()[0]->setText(tr("#Show"));
} }
} }

View File

@ -57,6 +57,7 @@ private:
void closeEvent(QCloseEvent *); void closeEvent(QCloseEvent *);
void createTrayAction(); void createTrayAction();
void CreateTrayIcon();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -43,21 +43,21 @@
<item> <item>
<widget class="QPushButton" name="startButton"> <widget class="QPushButton" name="startButton">
<property name="text"> <property name="text">
<string>Start</string> <string>#Start</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="stopButton"> <widget class="QPushButton" name="stopButton">
<property name="text"> <property name="text">
<string>Stop</string> <string>#Stop</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="restartButton"> <widget class="QPushButton" name="restartButton">
<property name="text"> <property name="text">
<string>Restart</string> <string>#Restart</string>
</property> </property>
<property name="flat"> <property name="flat">
<bool>false</bool> <bool>false</bool>
@ -67,7 +67,7 @@
<item> <item>
<widget class="QPushButton" name="clearlogButton"> <widget class="QPushButton" name="clearlogButton">
<property name="text"> <property name="text">
<string>Clear Log</string> <string>#ClearLog</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -94,7 +94,7 @@
<item> <item>
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>Host list</string> <string>#HostList</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
@ -129,11 +129,6 @@
<property name="viewMode"> <property name="viewMode">
<enum>QListView::ListMode</enum> <enum>QListView::ListMode</enum>
</property> </property>
<item>
<property name="text">
<string>Config 1 (www.hostname.com:port)</string>
</property>
</item>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -142,7 +137,7 @@
<item> <item>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="title"> <property name="title">
<string>Config Detail</string> <string>#ConfigDetail</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy"> <property name="fieldGrowthPolicy">
@ -151,56 +146,56 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Host</string> <string>#Host</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>www.hostname.com</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Port</string> <string>#Port</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>12345</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="text"> <property name="text">
<string>UUID</string> <string>#UUID</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="text"> <property name="text">
<string>TextLabel</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Transport</string> <string>#Transport</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>mKCP</string> <string/>
</property> </property>
</widget> </widget>
</item> </item>
@ -213,14 +208,14 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>Connection Settings</string> <string>#ConnectionSettings</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_11"> <widget class="QLabel" name="label_11">
<property name="text"> <property name="text">
<string>Settings</string> <string>#ConnectionSettings</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -246,16 +241,16 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>568</width> <width>568</width>
<height>29</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
<property name="title"> <property name="title">
<string>File</string> <string>#File</string>
</property> </property>
<widget class="QMenu" name="menuNew"> <widget class="QMenu" name="menuNew">
<property name="title"> <property name="title">
<string>New Connection</string> <string>#NewConnection</string>
</property> </property>
<addaction name="actionExisting_config"/> <addaction name="actionExisting_config"/>
<addaction name="actionEdit"/> <addaction name="actionEdit"/>
@ -265,37 +260,40 @@
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionExit"/> <addaction name="actionExit"/>
</widget> </widget>
<widget class="QMenu" name="menuAbout">
<property name="title">
<string>About</string>
</property>
</widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
<addaction name="menuAbout"/>
</widget> </widget>
<widget class="QStatusBar" name="statusBar"/> <widget class="QStatusBar" name="statusBar"/>
<action name="actionEdit"> <action name="actionEdit">
<property name="text"> <property name="text">
<string>Manual</string> <string>#ManuallyInput</string>
</property> </property>
</action> </action>
<action name="actionExisting_config"> <action name="actionExisting_config">
<property name="text"> <property name="text">
<string>Import</string> <string>#ImportConnection</string>
</property> </property>
</action> </action>
<action name="actionExit"> <action name="actionExit">
<property name="text"> <property name="text">
<string>Exit</string> <string>#Exit</string>
</property> </property>
</action> </action>
<action name="actionPreferences"> <action name="actionPreferences">
<property name="text"> <property name="text">
<string>Preferences</string> <string>#Preferences</string>
</property> </property>
</action> </action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<tabstops>
<tabstop>startButton</tabstop>
<tabstop>stopButton</tabstop>
<tabstop>restartButton</tabstop>
<tabstop>clearlogButton</tabstop>
<tabstop>listWidget</tabstop>
<tabstop>pushButton</tabstop>
<tabstop>logText</tabstop>
</tabstops>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -8,13 +8,12 @@
#include <QFileInfo> #include <QFileInfo>
#include <QProcess> #include <QProcess>
#include <unistd.h> #include <unistd.h>
#include <ui_PrefrencesWindow.h>
#include "utils.h" #include "utils.h"
#include "PrefrencesWindow.h" #include "PrefrencesWindow.h"
#include "MainWindow.h"
#include "ui_PrefrencesWindow.h"
PrefrencesWindow::PrefrencesWindow(MainWindow *parent) : PrefrencesWindow::PrefrencesWindow(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::PrefrencesWindow) ui(new Ui::PrefrencesWindow)
{ {
@ -23,16 +22,16 @@ PrefrencesWindow::PrefrencesWindow(MainWindow *parent) :
QJsonObject http = findValueFromJsonArray(rootObj.value("inbounds").toArray(), "tag", "http-in"); QJsonObject http = findValueFromJsonArray(rootObj.value("inbounds").toArray(), "tag", "http-in");
QJsonObject socks = findValueFromJsonArray(rootObj.value("inbounds").toArray(), "tag", "socks-in"); QJsonObject socks = findValueFromJsonArray(rootObj.value("inbounds").toArray(), "tag", "socks-in");
if(rootObj.value("v2suidEnabled").toBool()) { if(rootObj.value("v2suidEnabled").toBool()) {
ui->checkBox->setCheckState(Qt::Checked); ui->runAsRootCheckBox->setCheckState(Qt::Checked);
} }
if(!http.isEmpty()) { if(!http.isEmpty()) {
ui->httpPortLE->setText(QString::number(http.value("port").toInt())); ui->httpPortLE->setText(http.value("port").toString());
ui->httpCB->setCheckState(Qt::Checked); ui->httpCB->setCheckState(Qt::Checked);
} else { } else {
ui->httpPortLE->setDisabled(true); ui->httpPortLE->setDisabled(true);
} }
if(!socks.isEmpty()) { if(!socks.isEmpty()) {
ui->socksPortLE->setText(QString::number(socks.value("port").toInt())); ui->socksPortLE->setText(socks.value("port").toString());
ui->socksCB->setCheckState(Qt::Checked); ui->socksCB->setCheckState(Qt::Checked);
} else { } else {
ui->socksPortLE->setDisabled(true); ui->socksPortLE->setDisabled(true);
@ -110,12 +109,13 @@ void PrefrencesWindow::on_buttonBox_accepted()
QByteArray byteArray = modifiedDoc.toJson(QJsonDocument::Indented); QByteArray byteArray = modifiedDoc.toJson(QJsonDocument::Indented);
QFile confFile("conf/Hv2ray.config.json"); QFile confFile("conf/Hv2ray.config.json");
if(!confFile.open(QIODevice::WriteOnly)) { if(!confFile.open(QIODevice::WriteOnly)) {
showWarnMessageBox(this, tr("#Prefrences"), tr("#CannotOpenConfigFile"));
qDebug() << "Cannot open Hv2ray.config.json for modifying"; qDebug() << "Cannot open Hv2ray.config.json for modifying";
} }
confFile.write(byteArray); confFile.write(byteArray);
confFile.close(); confFile.close();
} else { } else {
showWarnMessageBox(this, tr("Config error"), tr("Port numbers cannot be the same!")); showWarnMessageBox(this, tr("Prefrences"), tr("PortNumbersCannotBeSame"));
} }
} }
} }
@ -140,3 +140,19 @@ void PrefrencesWindow::on_socksCB_stateChanged(int checked)
ui->socksPortLE->setText("1080"); ui->socksPortLE->setText("1080");
} }
} }
void PrefrencesWindow::on_httpAuthCB_stateChanged(int checked)
{
if(checked)
{
}
}
void PrefrencesWindow::on_runAsRootCheckBox_stateChanged(int arg1)
{
Q_UNUSED(arg1);
#ifdef _WIN32
showWarnMessageBox(this, tr("Prefrences"), tr("RunAsRootNotOnWindows"));
#endif
}

View File

@ -3,7 +3,6 @@
#include <QDialog> #include <QDialog>
#include <QJsonObject> #include <QJsonObject>
#include "MainWindow.h"
namespace Ui namespace Ui
{ {
@ -15,16 +14,20 @@ class PrefrencesWindow : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit PrefrencesWindow(MainWindow *parent = nullptr); explicit PrefrencesWindow(QWidget *parent = nullptr);
~PrefrencesWindow(); ~PrefrencesWindow();
QJsonObject rootObj; QJsonObject rootObj;
MainWindow *parentMW; QWidget *parentMW;
private slots: private slots:
void on_buttonBox_accepted(); void on_buttonBox_accepted();
void on_httpCB_stateChanged(int arg1); void on_httpCB_stateChanged(int arg1);
void on_socksCB_stateChanged(int arg1); void on_socksCB_stateChanged(int arg1);
void on_httpAuthCB_stateChanged(int arg1);
void on_runAsRootCheckBox_stateChanged(int arg1);
private: private:
Ui::PrefrencesWindow *ui; Ui::PrefrencesWindow *ui;
}; };

View File

@ -23,7 +23,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="title"> <property name="title">
<string>General</string> <string>#General</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
@ -31,12 +31,12 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>Language</string> <string>#Language</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="comboBox"> <widget class="QComboBox" name="languageComboBox">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -58,26 +58,26 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="text"> <property name="text">
<string>Run v2ray with root</string> <string>#RunAsRoot</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QCheckBox" name="checkBox"> <widget class="QCheckBox" name="runAsRootCheckBox">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Log Level</string> <string>#LogLevel</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QComboBox" name="comboBox_2"> <widget class="QComboBox" name="logLevelCheckBox">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -122,32 +122,32 @@
<item> <item>
<widget class="QGroupBox" name="groupBox_5"> <widget class="QGroupBox" name="groupBox_5">
<property name="title"> <property name="title">
<string>Mux Cool</string> <string>#MuxCool</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QCheckBox" name="checkBox_2"> <widget class="QCheckBox" name="muxEnabledCB">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
<property name="text"> <property name="text">
<string>Concurrency</string> <string>#Concurrency</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QSpinBox" name="spinBox"> <widget class="QSpinBox" name="muxConcurrencyTxt">
<property name="minimum"> <property name="minimum">
<number>1</number> <number>1</number>
</property> </property>
@ -168,7 +168,7 @@
<item row="0" column="1"> <item row="0" column="1">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>Inbound Settings</string> <string>#InboundSettings</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
<item> <item>
@ -183,14 +183,14 @@
<enum>Qt::LeftToRight</enum> <enum>Qt::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Port</string> <string>#Port</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -210,36 +210,36 @@
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Username</string> <string>#Username</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="text"> <property name="text">
<string>Auth</string> <string>#Auth</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_13"> <widget class="QLabel" name="label_13">
<property name="text"> <property name="text">
<string>Password</string> <string>#Password</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="checkBox_3"> <widget class="QCheckBox" name="httpAuthCB">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineEdit"/> <widget class="QLineEdit" name="httpAuthUsernameTxt"/>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_2"/> <widget class="QLineEdit" name="httpAuthPasswordTxt"/>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -253,7 +253,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Port</string> <string>#Port</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -267,43 +267,43 @@
<item row="0" column="1"> <item row="0" column="1">
<widget class="QCheckBox" name="socksCB"> <widget class="QCheckBox" name="socksCB">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_10"> <widget class="QLabel" name="label_10">
<property name="text"> <property name="text">
<string>Auth</string> <string>#Auth</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_11"> <widget class="QLabel" name="label_11">
<property name="text"> <property name="text">
<string>Username</string> <string>#Username</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
<string>Password</string> <string>#Password</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="checkBox_4"> <widget class="QCheckBox" name="socksAuthCB">
<property name="text"> <property name="text">
<string>Enabled</string> <string>#Enabled</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_3"/> <widget class="QLineEdit" name="socksAuthUsernameTxt"/>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_4"/> <widget class="QLineEdit" name="socksAuthPasswordTxt"/>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -323,6 +323,23 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>languageComboBox</tabstop>
<tabstop>runAsRootCheckBox</tabstop>
<tabstop>logLevelCheckBox</tabstop>
<tabstop>muxEnabledCB</tabstop>
<tabstop>muxConcurrencyTxt</tabstop>
<tabstop>httpCB</tabstop>
<tabstop>httpPortLE</tabstop>
<tabstop>httpAuthCB</tabstop>
<tabstop>httpAuthUsernameTxt</tabstop>
<tabstop>httpAuthPasswordTxt</tabstop>
<tabstop>socksCB</tabstop>
<tabstop>socksPortLE</tabstop>
<tabstop>socksAuthCB</tabstop>
<tabstop>socksAuthUsernameTxt</tabstop>
<tabstop>socksAuthPasswordTxt</tabstop>
</tabstops>
<resources/> <resources/>
<connections> <connections>
<connection> <connection>

View File

@ -65,7 +65,7 @@ int main(int argc, char *argv[])
QApplication _qApp(argc, argv); QApplication _qApp(argc, argv);
QTranslator translator; QTranslator translator;
if (translator.load(QString("zh-CN.qm"), QString("translations"))) if (translator.load(QString(":/translations/zh-CN.qm"), QString("translations")))
{ {
cout << "Loaded Chinese translations" << endl; cout << "Loaded Chinese translations" << endl;
} }
@ -73,7 +73,7 @@ int main(int argc, char *argv[])
RunGuard guard("Hv2ray"); RunGuard guard("Hv2ray");
if(!guard.isSingleInstance()) { if(!guard.isSingleInstance()) {
showWarnMessageBox(nullptr, "Hv2Ray", "Another instance of Hv2ray is already running!"); showWarnMessageBox(nullptr, QObject::tr("Hv2Ray"), QObject::tr("AnotherInstanceRunning"));
return -1; return -1;
} }

View File

@ -53,7 +53,7 @@ bool checkVCoreExes()
if (QFileInfo("v2ray").exists() && QFileInfo("geoip.dat").exists() && QFileInfo("geosite.dat").exists() && QFileInfo("v2ctl").exists()) { if (QFileInfo("v2ray").exists() && QFileInfo("geoip.dat").exists() && QFileInfo("geosite.dat").exists() && QFileInfo("v2ctl").exists()) {
return true; return true;
} else { } else {
showWarnMessageBox(nullptr, "v2ray core not found", "V2ray core files not found. Please download the latest version of v2ray and extract it into the current folder."); showWarnMessageBox(nullptr, QObject::tr("CoreNotFound"), QObject::tr("CoreFileNotFoundExplaination"));
return false; return false;
} }
} }

View File

@ -25,7 +25,7 @@ bool validationCheck(QString path)
QString output = QString(process.readAllStandardOutput()); QString output = QString(process.readAllStandardOutput());
if (!output.contains("Configuration OK")) { if (!output.contains("Configuration OK")) {
showWarnMessageBox(nullptr, "Error in configuration", output.mid(output.indexOf("anti-censorship.") + 17)); showWarnMessageBox(nullptr, QObject::tr("ConfigurationError"), output.mid(output.indexOf("anti-censorship.") + 17));
return false; return false;
} }
else return true; else return true;

View File

@ -3,35 +3,41 @@
<TS version="2.1"> <TS version="2.1">
<context> <context>
<name>ConnectionEditWindow</name> <name>ConnectionEditWindow</name>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="20"/>
<source>#ConnectionSettings</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="28"/> <location filename="../src/ConnectionEditWindow.ui" line="28"/>
<location filename="../src/ConnectionEditWindow.ui" line="423"/> <location filename="../src/ConnectionEditWindow.ui" line="335"/>
<source>Host</source> <source>#Host</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="42"/> <location filename="../src/ConnectionEditWindow.ui" line="42"/>
<source>Port</source> <source>#Port</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="56"/> <location filename="../src/ConnectionEditWindow.ui" line="56"/>
<source>Name</source> <source>#Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="73"/> <location filename="../src/ConnectionEditWindow.ui" line="73"/>
<source>UUID</source> <source>#UUID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="90"/> <location filename="../src/ConnectionEditWindow.ui" line="90"/>
<source>Alter ID</source> <source>#AlterID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="104"/> <location filename="../src/ConnectionEditWindow.ui" line="104"/>
<source>Security</source> <location filename="../src/ConnectionEditWindow.ui" line="702"/>
<source>#Security</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -41,28 +47,28 @@
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="117"/> <location filename="../src/ConnectionEditWindow.ui" line="117"/>
<location filename="../src/ConnectionEditWindow.ui" line="735"/> <location filename="../src/ConnectionEditWindow.ui" line="721"/>
<source>aes-128-gcm</source> <source>aes-128-gcm</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="122"/> <location filename="../src/ConnectionEditWindow.ui" line="122"/>
<location filename="../src/ConnectionEditWindow.ui" line="740"/> <location filename="../src/ConnectionEditWindow.ui" line="726"/>
<source>chacha20-poly1305</source> <source>chacha20-poly1305</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="127"/> <location filename="../src/ConnectionEditWindow.ui" line="127"/>
<location filename="../src/ConnectionEditWindow.ui" line="223"/> <location filename="../src/ConnectionEditWindow.ui" line="236"/>
<location filename="../src/ConnectionEditWindow.ui" line="646"/> <location filename="../src/ConnectionEditWindow.ui" line="632"/>
<location filename="../src/ConnectionEditWindow.ui" line="730"/> <location filename="../src/ConnectionEditWindow.ui" line="716"/>
<location filename="../src/ConnectionEditWindow.ui" line="797"/> <location filename="../src/ConnectionEditWindow.ui" line="783"/>
<source>none</source> <source>none</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="135"/> <location filename="../src/ConnectionEditWindow.ui" line="135"/>
<source>Transport</source> <source>#Transport</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -96,514 +102,558 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="181"/> <location filename="../src/ConnectionEditWindow.ui" line="194"/>
<source>Transport Settings (StreamSettingsObject)</source> <source>#TransportSettings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="212"/> <location filename="../src/ConnectionEditWindow.ui" line="225"/>
<source>TCP</source> <source>TCP</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="20"/> <location filename="../src/ConnectionEditWindow.ui" line="241"/>
<source>Connection Settings</source> <source>http</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="228"/>
<source>http (HttpHeaderobject)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="236"/>
<location filename="../src/ConnectionEditWindow.ui" line="632"/>
<location filename="../src/ConnectionEditWindow.ui" line="783"/>
<source>type</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="249"/> <location filename="../src/ConnectionEditWindow.ui" line="249"/>
<source>Request (HTTPRequestObject)</source> <location filename="../src/ConnectionEditWindow.ui" line="618"/>
<location filename="../src/ConnectionEditWindow.ui" line="769"/>
<source>#Type</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="259"/> <location filename="../src/ConnectionEditWindow.ui" line="262"/>
<source>{ <source>#Request</source>
&quot;version&quot;: &quot;1.1&quot;,
&quot;method&quot;: &quot;GET&quot;,
&quot;path&quot;: [&quot;/&quot;],
&quot;headers&quot;: {
&quot;Host&quot;: [&quot;www.baidu.com&quot;, &quot;www.bing.com&quot;],
&quot;User-Agent&quot;: [
&quot;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36&quot;,
&quot;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&quot;
],
&quot;Accept-Encoding&quot;: [&quot;gzip, deflate&quot;],
&quot;Connection&quot;: [&quot;keep-alive&quot;],
&quot;Pragma&quot;: &quot;no-cache&quot;
}
}
</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="288"/> <location filename="../src/ConnectionEditWindow.ui" line="282"/>
<source>Response (HTTPResponseObject)</source> <location filename="../src/ConnectionEditWindow.ui" line="310"/>
<source>#InsertDefaultContent</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="298"/> <location filename="../src/ConnectionEditWindow.ui" line="293"/>
<source>{ <source>#Response</source>
&quot;version&quot;: &quot;1.1&quot;,
&quot;status&quot;: &quot;200&quot;,
&quot;reason&quot;: &quot;OK&quot;,
&quot;headers&quot;: {
&quot;Content-Type&quot;: [&quot;application/octet-stream&quot;, &quot;video/mpeg&quot;],
&quot;Transfer-Encoding&quot;: [&quot;chunked&quot;],
&quot;Connection&quot;: [&quot;keep-alive&quot;],
&quot;Pragma&quot;: &quot;no-cache&quot;
}
}</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="322"/> <location filename="../src/ConnectionEditWindow.ui" line="324"/>
<source>HTTP</source> <source>HTTP</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="331"/> <location filename="../src/ConnectionEditWindow.ui" line="342"/>
<location filename="../src/ConnectionEditWindow.ui" line="441"/> <location filename="../src/ConnectionEditWindow.ui" line="369"/>
<source>v2ray.com</source> <location filename="../src/ConnectionEditWindow.ui" line="677"/>
<source>#Path</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="339"/> <location filename="../src/ConnectionEditWindow.ui" line="359"/>
<source>host</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="346"/>
<location filename="../src/ConnectionEditWindow.ui" line="373"/>
<location filename="../src/ConnectionEditWindow.ui" line="691"/>
<source>path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="353"/>
<location filename="../src/ConnectionEditWindow.ui" line="380"/>
<source>/</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="363"/>
<source>WebSocket</source> <source>WebSocket</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="389"/> <location filename="../src/ConnectionEditWindow.ui" line="385"/>
<source>headers (Key Value Pair)</source> <location filename="../src/ConnectionEditWindow.ui" line="748"/>
<source>#Headers</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="454"/> <location filename="../src/ConnectionEditWindow.ui" line="440"/>
<source>mKCP</source> <source>mKCP</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="462"/> <location filename="../src/ConnectionEditWindow.ui" line="448"/>
<source>MTU</source> <source>#MTU</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="488"/> <location filename="../src/ConnectionEditWindow.ui" line="474"/>
<source>TTI (ms)</source> <source>#TTI (ms)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="514"/> <location filename="../src/ConnectionEditWindow.ui" line="500"/>
<source>UplinkCapacity (MB/s)</source> <source>#UplinkCapacity (MB/s)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="537"/> <location filename="../src/ConnectionEditWindow.ui" line="523"/>
<source>Congestion</source> <source>#Congestion</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="544"/> <location filename="../src/ConnectionEditWindow.ui" line="530"/>
<source>Enabled</source> <source>#Enabled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="555"/> <location filename="../src/ConnectionEditWindow.ui" line="541"/>
<source>downlinkCapacity (MB/s)</source> <source>#DownlinkCapacity (MB/s)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="578"/> <location filename="../src/ConnectionEditWindow.ui" line="564"/>
<source>readBufferSize (MB)</source> <source>#ReadBufferSize (MB)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="601"/> <location filename="../src/ConnectionEditWindow.ui" line="587"/>
<source>writeBufferSize (MB)</source> <source>#WriteBufferSize (MB)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="626"/> <location filename="../src/ConnectionEditWindow.ui" line="612"/>
<source>header (Header Object)</source> <location filename="../src/ConnectionEditWindow.ui" line="761"/>
<source>#Header</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="651"/> <location filename="../src/ConnectionEditWindow.ui" line="637"/>
<location filename="../src/ConnectionEditWindow.ui" line="802"/> <location filename="../src/ConnectionEditWindow.ui" line="788"/>
<source>srtp (SRTP, FaceTime)</source> <source>srtp (SRTP, FaceTime)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="656"/> <location filename="../src/ConnectionEditWindow.ui" line="642"/>
<location filename="../src/ConnectionEditWindow.ui" line="807"/> <location filename="../src/ConnectionEditWindow.ui" line="793"/>
<source>utp (BitTorrent)</source> <source>utp (BitTorrent)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="661"/> <location filename="../src/ConnectionEditWindow.ui" line="647"/>
<location filename="../src/ConnectionEditWindow.ui" line="812"/> <location filename="../src/ConnectionEditWindow.ui" line="798"/>
<source>wechat-video (WeChat Video Message)</source> <source>wechat-video (WeChat Video Message)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="666"/> <location filename="../src/ConnectionEditWindow.ui" line="652"/>
<location filename="../src/ConnectionEditWindow.ui" line="817"/> <location filename="../src/ConnectionEditWindow.ui" line="803"/>
<source>dtls (DTLS 1.2)</source> <source>dtls (DTLS 1.2)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="671"/> <location filename="../src/ConnectionEditWindow.ui" line="657"/>
<location filename="../src/ConnectionEditWindow.ui" line="822"/> <location filename="../src/ConnectionEditWindow.ui" line="808"/>
<source>wireguard (WireGuard fake packets)</source> <source>wireguard (WireGuard fake packets)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="683"/> <location filename="../src/ConnectionEditWindow.ui" line="669"/>
<source>DomainSocket</source> <source>DomainSocket</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="698"/> <location filename="../src/ConnectionEditWindow.ui" line="694"/>
<source>/path/to/ds/file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ConnectionEditWindow.ui" line="708"/>
<source>QUIC</source> <source>QUIC</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="716"/> <location filename="../src/ConnectionEditWindow.ui" line="734"/>
<source>security</source> <source>#Key</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImportConfig</name>
<message>
<location filename="../src/ImportConfig.ui" line="20"/>
<source>Import file</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="748"/> <location filename="../src/ImportConfig.ui" line="28"/>
<source>key</source> <source>#ImportFrom</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="755"/> <location filename="../src/ImportConfig.ui" line="36"/>
<source>xxxxx</source> <source>Existing File</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="762"/> <location filename="../src/ImportConfig.ui" line="41"/>
<source>header</source> <source>VMess Connection String</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/ConnectionEditWindow.ui" line="775"/> <location filename="../src/ImportConfig.ui" line="51"/>
<source>header (HeaderObject)</source> <source>#FromFile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="57"/>
<source>#Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="73"/>
<source>#SelectFile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="82"/>
<source>#Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="92"/>
<source>#Inbound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="101"/>
<source>#UseCurrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="111"/>
<source>#UseImported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="123"/>
<source>#From VMess Connection String</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.ui" line="129"/>
<source>#VMess Connection String</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.cpp" line="34"/>
<source>OpenConfigFile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.cpp" line="44"/>
<location filename="../src/ImportConfig.cpp" line="72"/>
<location filename="../src/ImportConfig.cpp" line="79"/>
<location filename="../src/ImportConfig.cpp" line="117"/>
<source>ImportConfig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.cpp" line="44"/>
<source>CannotOpenFile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.cpp" line="72"/>
<source>SaveFailed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.cpp" line="79"/>
<source>CannotCopyCustomConfig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/ImportConfig.cpp" line="117"/>
<source>CannotGenerateConfig</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../src/mainwindow.ui" line="26"/> <location filename="../src/MainWindow.ui" line="26"/>
<location filename="../src/MainWindow.cpp" line="22"/>
<source>Hv2ray</source> <source>Hv2ray</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="46"/> <location filename="../src/MainWindow.ui" line="46"/>
<source>Start</source> <location filename="../src/MainWindow.cpp" line="33"/>
<source>#Start</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="53"/> <location filename="../src/MainWindow.ui" line="53"/>
<source>Stop</source> <location filename="../src/MainWindow.cpp" line="34"/>
<source>#Stop</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="60"/> <location filename="../src/MainWindow.ui" line="60"/>
<source>Restart</source> <location filename="../src/MainWindow.cpp" line="35"/>
<source>#Restart</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="70"/> <location filename="../src/MainWindow.ui" line="70"/>
<source>Clear Log</source> <source>#ClearLog</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="145"/> <location filename="../src/MainWindow.ui" line="97"/>
<source>Config Detail</source> <source>#HostList</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="97"/> <location filename="../src/MainWindow.ui" line="140"/>
<source>Host list</source> <source>#ConfigDetail</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="134"/> <location filename="../src/MainWindow.ui" line="149"/>
<source>Config 1 (www.hostname.com:port)</source> <source>#Host</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="154"/> <location filename="../src/MainWindow.ui" line="163"/>
<source>Host</source> <source>#Port</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="161"/> <location filename="../src/MainWindow.ui" line="177"/>
<source>www.hostname.com</source> <source>#UUID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="168"/> <location filename="../src/MainWindow.ui" line="191"/>
<source>Port</source> <source>#Transport</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="175"/> <location filename="../src/MainWindow.ui" line="211"/>
<source>12345</source> <location filename="../src/MainWindow.ui" line="218"/>
<source>#ConnectionSettings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="182"/> <location filename="../src/MainWindow.ui" line="249"/>
<source>UUID</source> <source>#File</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="189"/> <location filename="../src/MainWindow.ui" line="253"/>
<source>TextLabel</source> <source>#NewConnection</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="196"/> <location filename="../src/MainWindow.ui" line="268"/>
<source>Transport</source> <source>#ManuallyInput</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="203"/> <location filename="../src/MainWindow.ui" line="273"/>
<source>mKCP</source> <source>#ImportConnection</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="216"/> <location filename="../src/MainWindow.ui" line="278"/>
<source>Connection Settings</source> <source>#Exit</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="223"/> <location filename="../src/MainWindow.ui" line="283"/>
<source>Settings</source> <source>#Preferences</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="254"/> <location filename="../src/MainWindow.cpp" line="31"/>
<source>File</source> <location filename="../src/MainWindow.cpp" line="222"/>
<source>#Hide</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="258"/> <location filename="../src/MainWindow.cpp" line="32"/>
<source>New</source> <source>#Quit</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow.ui" line="262"/> <location filename="../src/MainWindow.cpp" line="225"/>
<source>From</source> <source>#Show</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="277"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="286"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="291"/>
<source>Vmess</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="296"/>
<source>Existing config</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="301"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="306"/>
<source>Preferences</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
<name>PrefrencesWindow</name> <name>PrefrencesWindow</name>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="14"/> <location filename="../src/PrefrencesWindow.ui" line="20"/>
<location filename="../src/PrefrencesWindow.cpp" line="118"/>
<location filename="../src/PrefrencesWindow.cpp" line="156"/>
<source>Prefrences</source> <source>Prefrences</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="20"/> <location filename="../src/PrefrencesWindow.ui" line="48"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="26"/>
<source>Language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="40"/>
<source>zh-CN</source> <source>zh-CN</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="45"/> <location filename="../src/PrefrencesWindow.ui" line="53"/>
<source>en-US</source> <source>en-US</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="53"/> <location filename="../src/PrefrencesWindow.ui" line="26"/>
<source>Run v2ray with root</source> <source>#General</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="60"/> <location filename="../src/PrefrencesWindow.ui" line="34"/>
<location filename="../src/PrefrencesWindow.ui" line="133"/> <source>#Language</source>
<location filename="../src/PrefrencesWindow.ui" line="183"/>
<source>Enabled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="67"/> <location filename="../src/PrefrencesWindow.ui" line="61"/>
<source>Log Level</source> <source>#RunAsRoot</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="87"/> <location filename="../src/PrefrencesWindow.ui" line="68"/>
<location filename="../src/PrefrencesWindow.ui" line="131"/>
<location filename="../src/PrefrencesWindow.ui" line="138"/>
<location filename="../src/PrefrencesWindow.ui" line="186"/>
<location filename="../src/PrefrencesWindow.ui" line="234"/>
<location filename="../src/PrefrencesWindow.ui" line="270"/>
<location filename="../src/PrefrencesWindow.ui" line="298"/>
<source>#Enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="75"/>
<source>#LogLevel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="95"/>
<source>debug</source> <source>debug</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="92"/> <location filename="../src/PrefrencesWindow.ui" line="100"/>
<source>info</source> <source>info</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="97"/> <location filename="../src/PrefrencesWindow.ui" line="105"/>
<source>warning</source> <source>warning</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="102"/> <location filename="../src/PrefrencesWindow.ui" line="110"/>
<source>error</source> <source>error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="107"/> <location filename="../src/PrefrencesWindow.ui" line="115"/>
<source>none</source> <source>none</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="118"/> <location filename="../src/PrefrencesWindow.ui" line="125"/>
<source>Inbound Settings</source> <source>#MuxCool</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="124"/> <location filename="../src/PrefrencesWindow.ui" line="145"/>
<source>#Concurrency</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="171"/>
<source>#InboundSettings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="193"/>
<location filename="../src/PrefrencesWindow.ui" line="256"/>
<source>#Port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="213"/>
<location filename="../src/PrefrencesWindow.ui" line="284"/>
<source>#Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="220"/>
<location filename="../src/PrefrencesWindow.ui" line="277"/>
<source>#Auth</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="227"/>
<location filename="../src/PrefrencesWindow.ui" line="291"/>
<source>#Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="177"/>
<source>HTTP</source> <source>HTTP</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="140"/> <location filename="../src/PrefrencesWindow.ui" line="200"/>
<location filename="../src/PrefrencesWindow.ui" line="169"/>
<source>Port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/PrefrencesWindow.ui" line="147"/>
<source>8080</source> <source>8080</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="163"/> <location filename="../src/PrefrencesWindow.ui" line="250"/>
<source>SOCKS</source> <source>SOCKS</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/PrefrencesWindow.ui" line="176"/> <location filename="../src/PrefrencesWindow.ui" line="263"/>
<source>9001</source> <source>9001</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context>
<context>
<name>importConf</name>
<message> <message>
<location filename="../src/importconf.ui" line="14"/> <location filename="../src/PrefrencesWindow.cpp" line="112"/>
<source>Import file</source> <source>#Prefrences</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/importconf.ui" line="45"/> <location filename="../src/PrefrencesWindow.cpp" line="112"/>
<source>File name:</source> <source>#CannotOpenConfigFile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/importconf.ui" line="59"/> <location filename="../src/PrefrencesWindow.cpp" line="118"/>
<source>open</source> <source>PortNumbersCannotBeSame</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/importconf.ui" line="66"/> <location filename="../src/PrefrencesWindow.cpp" line="156"/>
<source>Alias:</source> <source>RunAsRootNotOnWindows</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/importconf.cpp" line="29"/>
<source>Open Config File</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
<name>import_vmess</name> <name>QObject</name>
<message> <message>
<location filename="../src/import_vmess.ui" line="14"/> <location filename="../src/main.cpp" line="76"/>
<source>Vmess</source> <source>Hv2Ray</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/import_vmess.ui" line="55"/> <location filename="../src/main.cpp" line="76"/>
<source>Alias:</source> <source>AnotherInstanceRunning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="56"/>
<source>CoreNotFound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="56"/>
<source>CoreFileNotFoundExplaination</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/vinteract.cpp" line="28"/>
<source>ConfigurationError</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

File diff suppressed because it is too large Load Diff