语言:全部使用简体中文。

This commit is contained in:
2025-11-04 14:52:27 +08:00
parent 342b495cca
commit 02d4ec5625
11 changed files with 58 additions and 57 deletions

View File

@@ -42,10 +42,10 @@ bool ClientCore::Connect(const QString& ip, quint16 port)
} }
socket_->connectToHost(ip, port); socket_->connectToHost(ip, port);
if (!socket_->waitForConnected(3000)) { if (!socket_->waitForConnected(3000)) {
qCritical() << QString(tr("%1:%2 connect failed...")).arg(ip).arg(port); qCritical() << QString(tr("%1:%2 连接失败。")).arg(ip).arg(port);
return false; return false;
} }
qInfo() << QString(tr("%1:%2 connected success.")).arg(ip).arg(port); qInfo() << QString(tr("%1:%2 连接成功。")).arg(ip).arg(port);
connected_ = true; connected_ = true;
return true; return true;
} }
@@ -93,7 +93,7 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
case FrameBufferType::FBT_SER_MSG_YOURID: { case FrameBufferType::FBT_SER_MSG_YOURID: {
ownID_ = frame->data; ownID_ = frame->data;
GlobalData::Ins()->SetLocalID(ownID_); GlobalData::Ins()->SetLocalID(ownID_);
qInfo() << QString(tr("own id: %1")).arg(ownID_); qInfo() << QString(tr("本机ID: %1")).arg(ownID_);
emit sigYourId(frame); emit sigYourId(frame);
break; break;
} }
@@ -106,11 +106,11 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
DirFileInfoVec vec; DirFileInfoVec vec;
InfoMsg info = infoUnpack<InfoMsg>(frame->data); InfoMsg info = infoUnpack<InfoMsg>(frame->data);
if (!localFile_.GetDirFile(info.msg, vec)) { if (!localFile_.GetDirFile(info.msg, vec)) {
qWarning() << QString(tr("get dir file failed use %1")).arg(info.msg); qWarning() << QString(tr("访问文件失败: %1")).arg(info.msg);
return; return;
} }
if (!Send<DirFileInfoVec>(vec, FBT_CLI_ANS_DIRFILE, frame->fid)) { if (!Send<DirFileInfoVec>(vec, FBT_CLI_ANS_DIRFILE, frame->fid)) {
qCritical() << QString(tr("send dir file result failed.")); qCritical() << QString(tr("发送文件列表结果失败。"));
return; return;
} }
break; break;
@@ -182,7 +182,7 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
break; break;
} }
default: default:
qCritical() << QString("unknown frame type: %1").arg(frame->type); qCritical() << QString("未知的帧类型: %1").arg(frame->type);
break; break;
} }
} }
@@ -202,7 +202,7 @@ bool ClientCore::Send(QSharedPointer<FrameBuffer> frame)
bool ClientCore::Send(const char* data, qint64 len) bool ClientCore::Send(const char* data, qint64 len)
{ {
if (socket_->state() != QAbstractSocket::ConnectedState) { if (socket_->state() != QAbstractSocket::ConnectedState) {
qCritical() << QString("client %1 not connected...").arg(remoteID_); qCritical() << QString("客户端 %1 未连接...").arg(remoteID_);
return false; return false;
} }
@@ -212,7 +212,7 @@ bool ClientCore::Send(const char* data, qint64 len)
bytesWritten = socket_->write(data, len); bytesWritten = socket_->write(data, len);
} }
if (bytesWritten == -1 || !socket_->waitForBytesWritten(5000)) { if (bytesWritten == -1 || !socket_->waitForBytesWritten(5000)) {
qCritical() << QString("Send data to server failed. %1").arg(socket_->errorString()); qCritical() << QString("向服务器发送数据失败: %1").arg(socket_->errorString());
return false; return false;
} }
return true; return true;

View File

@@ -356,7 +356,7 @@ void SendThread::run()
auto br = task_->file.read(frame->data.data(), CHUNK_BUF_SIZE); auto br = task_->file.read(frame->data.data(), CHUNK_BUF_SIZE);
if (br == -1) { if (br == -1) {
qCritical() << QString(tr("read file failed: %1")).arg(task_->file.errorString()); qCritical() << QString(tr("读取失败: %1")).arg(task_->file.errorString());
isSuccess_ = false; isSuccess_ = false;
break; break;
} }
@@ -364,7 +364,7 @@ void SendThread::run()
invokeSuccess = QMetaObject::invokeMethod(cliCore_, "SendFrame", Qt::BlockingQueuedConnection, invokeSuccess = QMetaObject::invokeMethod(cliCore_, "SendFrame", Qt::BlockingQueuedConnection,
Q_RETURN_ARG(bool, isSuccess_), Q_ARG(QSharedPointer<FrameBuffer>, frame)); Q_RETURN_ARG(bool, isSuccess_), Q_ARG(QSharedPointer<FrameBuffer>, frame));
if (!invokeSuccess || !isSuccess_) { if (!invokeSuccess || !isSuccess_) {
qCritical() << QString(tr("send to %1 file failed.")).arg(task_->task.remoteId); qCritical() << QString(tr("向 %1 发送失败.")).arg(task_->task.remoteId);
break; break;
} }
task_->tranSize += frame->data.size(); task_->tranSize += frame->data.size();

View File

@@ -22,7 +22,7 @@ Compare::~Compare()
void Compare::InitMenu() void Compare::InitMenu()
{ {
menu_ = new QMenu(ui->tableWidget); menu_ = new QMenu(ui->tableWidget);
menu_->addAction(tr("Try2Local"), this, [this]() { menu_->addAction(tr("尝试访问本地路径"), this, [this]() {
auto selected = ui->tableWidget->selectedItems(); auto selected = ui->tableWidget->selectedItems();
if (selected.size() != 3) { if (selected.size() != 3) {
return; return;
@@ -31,7 +31,7 @@ void Compare::InitMenu()
auto path = item->text(); auto path = item->text();
emit sigTryVisit(true, path); emit sigTryVisit(true, path);
}); });
menu_->addAction(tr("Try2Remote"), this, [this]() { menu_->addAction(tr("尝试访问远程路径"), this, [this]() {
auto selected = ui->tableWidget->selectedItems(); auto selected = ui->tableWidget->selectedItems();
if (selected.size() != 3) { if (selected.size() != 3) {
return; return;
@@ -70,7 +70,7 @@ void Compare::InitControl()
void Compare::InitTabWidget() void Compare::InitTabWidget()
{ {
QStringList headers; QStringList headers;
headers << tr("FileName") << tr("LocalDir") << tr("RemoteDir"); headers << tr("文件") << tr("本地目录") << tr("远端目录");
ui->tableWidget->setColumnCount(headers.size()); ui->tableWidget->setColumnCount(headers.size());
ui->tableWidget->setHorizontalHeaderLabels(headers); ui->tableWidget->setHorizontalHeaderLabels(headers);
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
@@ -101,13 +101,13 @@ void Compare::Save()
{ {
auto titleKey = ui->comboBox->currentText().trimmed(); auto titleKey = ui->comboBox->currentText().trimmed();
if (titleKey.isEmpty()) { if (titleKey.isEmpty()) {
FTCommon::msg(this, tr("Please select or input a title.")); FTCommon::msg(this, tr("请输入标题"));
return; return;
} }
QFile file("CompareData.xml"); QFile file("CompareData.xml");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
FTCommon::msg(this, tr("Failed to open data file.")); FTCommon::msg(this, tr("打开数据文件失败。"));
return; return;
} }
@@ -179,20 +179,20 @@ void Compare::Save()
ui->comboBox->addItem(titleKey); ui->comboBox->addItem(titleKey);
} }
FTCommon::msg(this, tr("Data saved successfully.")); FTCommon::msg(this, tr("数据保存成功。"));
} }
void Compare::Load() void Compare::Load()
{ {
auto titleKey = ui->comboBox->currentText().trimmed(); auto titleKey = ui->comboBox->currentText().trimmed();
if (titleKey.isEmpty()) { if (titleKey.isEmpty()) {
FTCommon::msg(this, tr("Please select or input a title.")); FTCommon::msg(this, tr("请选择或输入标题。"));
return; return;
} }
QFile file("CompareData.xml"); QFile file("CompareData.xml");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
FTCommon::msg(this, tr("Failed to open data file.")); FTCommon::msg(this, tr("打开数据文件失败。"));
return; return;
} }
@@ -237,7 +237,7 @@ void Compare::Load()
file.close(); file.close();
if (!found) { if (!found) {
FTCommon::msg(this, tr("No data found for the selected title.")); FTCommon::msg(this, tr("没有找到标题对应的数据。"));
} else { } else {
// FTCommon::msg(this, tr("Data loaded successfully.")); // FTCommon::msg(this, tr("Data loaded successfully."));
} }
@@ -319,7 +319,7 @@ void Compare::TransToRight()
void Compare::deleteSelectedRows() void Compare::deleteSelectedRows()
{ {
auto r = FTCommon::affirm(this, tr("confirm"), tr("delete selected rows?")); auto r = FTCommon::affirm(this, tr("确认"), tr("删除选中的行?"));
if (!r) { if (!r) {
return; return;
} }

View File

@@ -22,14 +22,14 @@
<item> <item>
<widget class="QPushButton" name="btnLoad"> <widget class="QPushButton" name="btnLoad">
<property name="text"> <property name="text">
<string>Load</string> <string>加载</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="btnSave"> <widget class="QPushButton" name="btnSave">
<property name="text"> <property name="text">
<string>Save</string> <string>保存</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -55,7 +55,7 @@
<item> <item>
<widget class="QPushButton" name="btnReplace"> <widget class="QPushButton" name="btnReplace">
<property name="text"> <property name="text">
<string>Replace</string> <string>替换</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -69,7 +69,7 @@
<item> <item>
<widget class="QPushButton" name="btnLeft"> <widget class="QPushButton" name="btnLeft">
<property name="text"> <property name="text">
<string>ToLeft</string> <string>下载</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -92,14 +92,14 @@
<item> <item>
<widget class="QPushButton" name="pushButton"> <widget class="QPushButton" name="pushButton">
<property name="text"> <property name="text">
<string>Search</string> <string>搜索</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="pushButton_2"> <widget class="QPushButton" name="pushButton_2">
<property name="text"> <property name="text">
<string>Reset</string> <string>重置</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -119,7 +119,7 @@
<item> <item>
<widget class="QPushButton" name="btnRight"> <widget class="QPushButton" name="btnRight">
<property name="text"> <property name="text">
<string>ToRight</string> <string>上传</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -106,7 +106,7 @@ void Connecter::Connect()
QString ip; QString ip;
QString port; QString port;
if (!parseIpPort(ui->comboBox->currentText(), ip, port)) { if (!parseIpPort(ui->comboBox->currentText(), ip, port)) {
FTCommon::msg(this, QString(tr("IP or port is invalid."))); FTCommon::msg(this, QString(tr("IP或者端口不合法。")));
return; return;
} }
emit sigDoConnect(ip, port.toInt()); emit sigDoConnect(ip, port.toInt());
@@ -137,7 +137,7 @@ void Connecter::setState(ConnectState cs)
void Connecter::Disconnect() void Connecter::Disconnect()
{ {
qWarning() << QString(tr("Disconnected...")); qWarning() << QString(tr("断开连接。"));
emit sigDisConnect(); emit sigDisConnect();
} }
@@ -149,7 +149,7 @@ void Connecter::RefreshClient()
frame->type = FBT_SER_MSG_ASKCLIENTS; frame->type = FBT_SER_MSG_ASKCLIENTS;
auto sendRet = ClientCore::syncInvoke(clientCore_, frame); auto sendRet = ClientCore::syncInvoke(clientCore_, frame);
if (!sendRet) { if (!sendRet) {
qCritical() << QString(tr("send ask client list failed.")); qCritical() << QString(tr("请求查询客户端列表失败。"));
return; return;
} }
qInfo() << QString(tr("ask client list...")); qInfo() << QString(tr("ask client list..."));

View File

@@ -19,7 +19,7 @@
<item> <item>
<widget class="QLabel" name="lbIP"> <widget class="QLabel" name="lbIP">
<property name="text"> <property name="text">
<string>Server:</string> <string>服务器:</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -67,7 +67,7 @@
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>OwnID:</string> <string>本机ID:</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -84,7 +84,7 @@
<enum>Qt::FocusPolicy::NoFocus</enum> <enum>Qt::FocusPolicy::NoFocus</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Disconnect</string> <string>断开</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -104,7 +104,7 @@
<item> <item>
<widget class="QPushButton" name="btnRefresh"> <widget class="QPushButton" name="btnRefresh">
<property name="text"> <property name="text">
<string>Refresh</string> <string>刷新</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -124,7 +124,7 @@
<item> <item>
<widget class="QPushButton" name="btnConnect"> <widget class="QPushButton" name="btnConnect">
<property name="text"> <property name="text">
<string>Connect</string> <string>连接</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -60,7 +60,7 @@ void FileManager::SetModeStr(const QString& modeStr, int type, ClientCore* clien
void FileManager::InitControl() void FileManager::InitControl()
{ {
QStringList headers; QStringList headers;
headers << tr("") << tr("FileName") << tr("ModifyTime") << tr("Type") << tr("Size"); headers << tr("") << tr("文件名称") << tr("最后修改时间") << tr("类型") << tr("大小");
ui->tableWidget->setColumnCount(headers.size()); ui->tableWidget->setColumnCount(headers.size());
ui->tableWidget->setHorizontalHeaderLabels(headers); ui->tableWidget->setHorizontalHeaderLabels(headers);
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
@@ -457,7 +457,7 @@ void FileManager::evtHome()
auto r = fileHelper_->GetHome(); auto r = fileHelper_->GetHome();
auto curPath = ui->comboBox->currentText(); auto curPath = ui->comboBox->currentText();
SetRoot(curPath); SetRoot(curPath);
qDebug() << QString(tr("%1 get home ret:%2").arg(__FUNCTION__).arg(r)); qDebug() << QString(tr("%1 获取家目录结果:%2").arg(__FUNCTION__).arg(r));
} }
void FileManager::evtFile() void FileManager::evtFile()
@@ -465,7 +465,7 @@ void FileManager::evtFile()
auto curPath = ui->comboBox->currentText(); auto curPath = ui->comboBox->currentText();
auto r = fileHelper_->GetDirFile(curPath); auto r = fileHelper_->GetDirFile(curPath);
SetRoot(curPath); SetRoot(curPath);
qDebug() << QString(tr("%1 get files ret:%2").arg(__FUNCTION__).arg(r)); qDebug() << QString(tr("%1 获取文件结果:%2").arg(__FUNCTION__).arg(r));
} }
void FileManager::evtUp() void FileManager::evtUp()

View File

@@ -36,21 +36,21 @@
<item> <item>
<widget class="QPushButton" name="btnVisit"> <widget class="QPushButton" name="btnVisit">
<property name="text"> <property name="text">
<string>Go</string> <string>访问</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="btnHome"> <widget class="QPushButton" name="btnHome">
<property name="text"> <property name="text">
<string>Home</string> <string>家目录</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="btnUp"> <widget class="QPushButton" name="btnUp">
<property name="text"> <property name="text">
<string>Up</string> <string>上一级</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -19,7 +19,7 @@
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>From:</string> <string>从:</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -49,7 +49,7 @@
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>To:</string> <string>到:</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -90,7 +90,7 @@
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Task:</string> <string>任务详情:</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -113,7 +113,7 @@
<item> <item>
<widget class="QPushButton" name="btnCancel"> <widget class="QPushButton" name="btnCancel">
<property name="text"> <property name="text">
<string>Cancel</string> <string>取消退出</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -60,8 +60,8 @@ void frelayGUI::InitControl()
localFile_ = new FileManager(this); localFile_ = new FileManager(this);
remoteFile_ = new FileManager(this); remoteFile_ = new FileManager(this);
localFile_->SetModeStr(tr("Local:"), 0, clientCore_); localFile_->SetModeStr(tr("本地:"), 0, clientCore_);
remoteFile_->SetModeStr(tr("Remote:"), 1, clientCore_); remoteFile_->SetModeStr(tr("远端:"), 1, clientCore_);
tabWidget_ = new QTabWidget(this); tabWidget_ = new QTabWidget(this);
@@ -98,8 +98,8 @@ void frelayGUI::ControlLayout()
sTop->addWidget(tabWidget_); sTop->addWidget(tabWidget_);
sTop->addWidget(connecter_); sTop->addWidget(connecter_);
tabWidget_->addTab(logPrint, tr("Log")); tabWidget_->addTab(logPrint, tr("日志"));
tabWidget_->addTab(compare_, tr("Compare")); tabWidget_->addTab(compare_, tr("文件对照"));
sFile->addWidget(localFile_); sFile->addWidget(localFile_);
sFile->addWidget(remoteFile_); sFile->addWidget(remoteFile_);
@@ -138,7 +138,7 @@ void frelayGUI::ControlMsgHander(QtMsgType type, const QMessageLogContext& conte
void frelayGUI::HandleTask(const QVector<TransTask>& tasks) void frelayGUI::HandleTask(const QVector<TransTask>& tasks)
{ {
if (!clientCore_->IsConnect()) { if (!clientCore_->IsConnect()) {
qCritical() << QString(tr("Not connect to server.")); qCritical() << QString(tr("未连接到服务器。。。"));
return; return;
} }
transform_->SetTasks(tasks); transform_->SetTasks(tasks);

View File

@@ -1,13 +1,14 @@
# frelay # frelay
A tool that uses a relay server to upload and download files from remote clients. 一个通过中继服务器在多个客户端之间相互传输文件的工具。
## Features ## 功能特点
1. Minimal configuration—simply start a server, connect to it, and begin transferring files. 1. 极简配置——只需启动服务器,连接至服务器,即可开始传输文件。
2. If you frequently transfer the same files repeatedly, frelay offers a local-remote file mapping feature for one-click transfers. 2. 若需频繁传输相同文件,frelay 提供本地-远程文件映射功能,支持一键传输。
## Disclaimer And Warning ## 免责声明与警告
This tool is solely designed for simple file transmission between clients via a relay server. It does not include any security validation logic to prevent data attacks or similar threats. It is primarily intended for temporary, non-sensitive file transfers. Please close the software or disconnect from the relay server when not in use.
The software may contain unexpected bugs that could corrupt or lose your files. Please ensure proper backups or use it only for non-critical file transfers. 本工具仅设计用于通过中继服务器在客户端之间进行简单的文件传输,未包含任何可防范数据攻击或类似威胁的安全验证逻辑,主要适用于临时性、非敏感的文件传输场景。请在不使用时及时关闭软件或断开与中继服务器的连接。
本软件可能存在意外错误,可能导致文件损坏或丢失。请务必做好文件备份,或仅将其用于非关键文件的传输。