From 9bb4a5263cf793aabf5133b97dc489ff39c34787 Mon Sep 17 00:00:00 2001
From: HFO4 <912394456@qq.com>
Date: Thu, 29 Sep 2022 17:40:56 +0800
Subject: [PATCH] i18n: logs in aria2/auth/cache/cluster/serializer

---
 pkg/aria2/common/common.go   |  4 ++--
 pkg/aria2/monitor/monitor.go | 15 ++++++++-------
 pkg/auth/auth.go             |  6 +++---
 pkg/cache/driver.go          |  2 +-
 pkg/cache/memo.go            |  2 +-
 pkg/cache/redis.go           |  2 +-
 pkg/cluster/errors.go        |  2 +-
 pkg/cluster/master.go        | 10 +++++-----
 pkg/cluster/pool.go          |  4 ++--
 pkg/cluster/slave.go         | 22 +++++++++++-----------
 pkg/serializer/error.go      |  2 ++
 11 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/pkg/aria2/common/common.go b/pkg/aria2/common/common.go
index 8f281d8..bfb5fc1 100644
--- a/pkg/aria2/common/common.go
+++ b/pkg/aria2/common/common.go
@@ -50,9 +50,9 @@ const (
 
 var (
 	// ErrNotEnabled 功能未开启错误
-	ErrNotEnabled = serializer.NewError(serializer.CodeNoPermissionErr, "离线下载功能未开启", nil)
+	ErrNotEnabled = serializer.NewError(serializer.CodeFeatureNotEnabled, "", nil)
 	// ErrUserNotFound 未找到下载任务创建者
-	ErrUserNotFound = serializer.NewError(serializer.CodeNotFound, "无法找到任务创建者", nil)
+	ErrUserNotFound = serializer.NewError(serializer.CodeUserNotFound, "", nil)
 )
 
 // DummyAria2 未开启Aria2功能时使用的默认处理器
diff --git a/pkg/aria2/monitor/monitor.go b/pkg/aria2/monitor/monitor.go
index a515b66..32b86d8 100644
--- a/pkg/aria2/monitor/monitor.go
+++ b/pkg/aria2/monitor/monitor.go
@@ -45,7 +45,7 @@ func NewMonitor(task *model.Download, pool cluster.Pool, mqClient mq.MQ) {
 
 		monitor.notifier = mqClient.Subscribe(monitor.Task.GID, 0)
 	} else {
-		monitor.setErrorStatus(errors.New("节点不可用"))
+		monitor.setErrorStatus(errors.New("node not avaliable"))
 	}
 }
 
@@ -77,11 +77,12 @@ func (monitor *Monitor) Update() bool {
 
 	if err != nil {
 		monitor.retried++
-		util.Log().Warning("无法获取下载任务[%s]的状态,%s", monitor.Task.GID, err)
+		util.Log().Warning("Cannot get status of download task %q: %s", monitor.Task.GID, err)
 
 		// 十次重试后认定为任务失败
 		if monitor.retried > MAX_RETRY {
-			util.Log().Warning("无法获取下载任务[%s]的状态,超过最大重试次数限制,%s", monitor.Task.GID, err)
+			util.Log().Warning("Cannot get status of download task %q,exceed maximum retry threshold: %s",
+				monitor.Task.GID, err)
 			monitor.setErrorStatus(err)
 			monitor.RemoveTempFolder()
 			return true
@@ -93,7 +94,7 @@ func (monitor *Monitor) Update() bool {
 
 	// 磁力链下载需要跟随
 	if len(status.FollowedBy) > 0 {
-		util.Log().Debug("离线下载[%s]重定向至[%s]", monitor.Task.GID, status.FollowedBy[0])
+		util.Log().Debug("Redirected download task from %q to %q.", monitor.Task.GID, status.FollowedBy[0])
 		monitor.Task.GID = status.FollowedBy[0]
 		monitor.Task.Save()
 		return false
@@ -101,13 +102,13 @@ func (monitor *Monitor) Update() bool {
 
 	// 更新任务信息
 	if err := monitor.UpdateTaskInfo(status); err != nil {
-		util.Log().Warning("无法更新下载任务[%s]的任务信息[%s],", monitor.Task.GID, err)
+		util.Log().Warning("Failed to update status of download task %q: %s", monitor.Task.GID, err)
 		monitor.setErrorStatus(err)
 		monitor.RemoveTempFolder()
 		return true
 	}
 
-	util.Log().Debug("离线下载[%s]更新状态[%s]", status.Gid, status.Status)
+	util.Log().Debug("Remote download %q status updated to %q.", status.Gid, status.Status)
 
 	switch status.Status {
 	case "complete":
@@ -122,7 +123,7 @@ func (monitor *Monitor) Update() bool {
 		monitor.RemoveTempFolder()
 		return true
 	default:
-		util.Log().Warning("下载任务[%s]返回未知状态信息[%s],", monitor.Task.GID, status.Status)
+		util.Log().Warning("Download task %q returns unknown status %q.", monitor.Task.GID, status.Status)
 		return true
 	}
 }
diff --git a/pkg/auth/auth.go b/pkg/auth/auth.go
index 6b009d3..32a7e91 100644
--- a/pkg/auth/auth.go
+++ b/pkg/auth/auth.go
@@ -17,10 +17,10 @@ import (
 )
 
 var (
-	ErrAuthFailed        = serializer.NewError(serializer.CodeNoPermissionErr, "鉴权失败", nil)
+	ErrAuthFailed        = serializer.NewError(serializer.CodeInvalidSign, "invalid sign", nil)
 	ErrAuthHeaderMissing = serializer.NewError(serializer.CodeNoPermissionErr, "authorization header is missing", nil)
 	ErrExpiresMissing    = serializer.NewError(serializer.CodeNoPermissionErr, "expire timestamp is missing", nil)
-	ErrExpired           = serializer.NewError(serializer.CodeSignExpired, "签名已过期", nil)
+	ErrExpired           = serializer.NewError(serializer.CodeSignExpired, "signature expired", nil)
 )
 
 const CrHeaderPrefix = "X-Cr-"
@@ -136,7 +136,7 @@ func Init() {
 	} else {
 		secretKey = conf.SlaveConfig.Secret
 		if secretKey == "" {
-			util.Log().Panic("未指定 SlaveSecret,请前往配置文件中指定")
+			util.Log().Panic("SlaveSecret is not set, please specify it in config file.")
 		}
 	}
 	General = HMACAuth{
diff --git a/pkg/cache/driver.go b/pkg/cache/driver.go
index 74c1219..5a919a7 100644
--- a/pkg/cache/driver.go
+++ b/pkg/cache/driver.go
@@ -24,7 +24,7 @@ func Init(isSlave bool) {
 	if isSlave {
 		err := Store.Sets(conf.OptionOverwrite, "setting_")
 		if err != nil {
-			util.Log().Warning("无法覆盖数据库设置: %s", err)
+			util.Log().Warning("Failed to overwrite database setting: %s", err)
 		}
 	}
 }
diff --git a/pkg/cache/memo.go b/pkg/cache/memo.go
index 8b7522b..0c55ba5 100644
--- a/pkg/cache/memo.go
+++ b/pkg/cache/memo.go
@@ -53,7 +53,7 @@ func (store *MemoStore) GarbageCollect() {
 	store.Store.Range(func(key, value interface{}) bool {
 		if item, ok := value.(itemWithTTL); ok {
 			if item.expires > 0 && item.expires < time.Now().Unix() {
-				util.Log().Debug("回收垃圾[%s]", key.(string))
+				util.Log().Debug("Cache %q is garbage collected.", key.(string))
 				store.Store.Delete(key)
 			}
 		}
diff --git a/pkg/cache/redis.go b/pkg/cache/redis.go
index c2b9bb7..b9f7254 100644
--- a/pkg/cache/redis.go
+++ b/pkg/cache/redis.go
@@ -66,7 +66,7 @@ func NewRedisStore(size int, network, address, password, database string) *Redis
 					redis.DialPassword(password),
 				)
 				if err != nil {
-					util.Log().Warning("无法创建Redis连接:%s", err)
+					util.Log().Warning("Failed to create Redis connection: %s", err)
 					return nil, err
 				}
 				return c, nil
diff --git a/pkg/cluster/errors.go b/pkg/cluster/errors.go
index 84b2ad8..acd21d3 100644
--- a/pkg/cluster/errors.go
+++ b/pkg/cluster/errors.go
@@ -8,5 +8,5 @@ import (
 var (
 	ErrFeatureNotExist = errors.New("No nodes in nodepool match the feature specificed")
 	ErrIlegalPath      = errors.New("path out of boundary of setting temp folder")
-	ErrMasterNotFound  = serializer.NewError(serializer.CodeMasterNotFound, "未知的主机节点", nil)
+	ErrMasterNotFound  = serializer.NewError(serializer.CodeMasterNotFound, "Unknown master node id", nil)
 )
diff --git a/pkg/cluster/master.go b/pkg/cluster/master.go
index 885e99a..9c3dc61 100644
--- a/pkg/cluster/master.go
+++ b/pkg/cluster/master.go
@@ -161,7 +161,7 @@ func (r *rpcService) Init() error {
 	// 解析RPC服务地址
 	server, err := url.Parse(r.parent.Model.Aria2OptionsSerialized.Server)
 	if err != nil {
-		util.Log().Warning("无法解析主机 Aria2 RPC 服务地址,%s", err)
+		util.Log().Warning("Failed to parse Aria2 RPC server URL: %s", err)
 		return err
 	}
 	server.Path = "/jsonrpc"
@@ -171,7 +171,7 @@ func (r *rpcService) Init() error {
 	if r.parent.Model.Aria2OptionsSerialized.Options != "" {
 		err = json.Unmarshal([]byte(r.parent.Model.Aria2OptionsSerialized.Options), &globalOptions)
 		if err != nil {
-			util.Log().Warning("无法解析主机 Aria2 配置,%s", err)
+			util.Log().Warning("Failed to parse aria2 options: %s", err)
 			return err
 		}
 	}
@@ -221,7 +221,7 @@ func (r *rpcService) Status(task *model.Download) (rpc.StatusInfo, error) {
 	res, err := r.Caller.TellStatus(task.GID)
 	if err != nil {
 		// 失败后重试
-		util.Log().Debug("无法获取离线下载状态,%s,稍后重试", err)
+		util.Log().Debug("Failed to get download task status, please retry later: %s", err)
 		time.Sleep(r.retryDuration)
 		res, err = r.Caller.TellStatus(task.GID)
 	}
@@ -233,7 +233,7 @@ func (r *rpcService) Cancel(task *model.Download) error {
 	// 取消下载任务
 	_, err := r.Caller.Remove(task.GID)
 	if err != nil {
-		util.Log().Warning("无法取消离线下载任务[%s], %s", task.GID, err)
+		util.Log().Warning("Failed to cancel task %q: %s", task.GID, err)
 	}
 
 	return err
@@ -264,7 +264,7 @@ func (s *rpcService) DeleteTempFile(task *model.Download) error {
 		time.Sleep(d)
 		err := os.RemoveAll(src)
 		if err != nil {
-			util.Log().Warning("无法删除离线下载临时目录[%s], %s", src, err)
+			util.Log().Warning("Failed to delete temp download folder: %q: %s", src, err)
 		}
 	}(s.deletePaddingDuration, task.Parent)
 
diff --git a/pkg/cluster/pool.go b/pkg/cluster/pool.go
index 710b0a3..d6704b6 100644
--- a/pkg/cluster/pool.go
+++ b/pkg/cluster/pool.go
@@ -42,7 +42,7 @@ func Init() {
 	Default = &NodePool{}
 	Default.Init()
 	if err := Default.initFromDB(); err != nil {
-		util.Log().Warning("节点池初始化失败, %s", err)
+		util.Log().Warning("Failed to initialize node pool: %s", err)
 	}
 }
 
@@ -83,7 +83,7 @@ func (pool *NodePool) GetNodeByID(id uint) Node {
 }
 
 func (pool *NodePool) nodeStatusChange(isActive bool, id uint) {
-	util.Log().Debug("从机节点 [ID=%d] 状态变更 [Active=%t]", id, isActive)
+	util.Log().Debug("Slave node [ID=%d] status changed to [Active=%t].", id, isActive)
 	var node Node
 	pool.lock.Lock()
 	if n, ok := pool.inactive[id]; ok {
diff --git a/pkg/cluster/slave.go b/pkg/cluster/slave.go
index 79118b2..94d286b 100644
--- a/pkg/cluster/slave.go
+++ b/pkg/cluster/slave.go
@@ -172,7 +172,7 @@ func (node *SlaveNode) StartPingLoop() {
 	recoverDuration := time.Duration(model.GetIntSetting("slave_recover_interval", 600)) * time.Second
 	pingTicker := time.Duration(0)
 
-	util.Log().Debug("从机节点 [%s] 启动心跳循环", node.Model.Name)
+	util.Log().Debug("Slave node %q heartbeat loop started.", node.Model.Name)
 	retry := 0
 	recoverMode := false
 	isFirstLoop := true
@@ -185,39 +185,39 @@ loop:
 				pingTicker = tickDuration
 			}
 
-			util.Log().Debug("从机节点 [%s] 发送Ping", node.Model.Name)
+			util.Log().Debug("Slave node %q send ping.", node.Model.Name)
 			res, err := node.Ping(node.getHeartbeatContent(isFirstLoop))
 			isFirstLoop = false
 
 			if err != nil {
-				util.Log().Debug("Ping从机节点 [%s] 时发生错误: %s", node.Model.Name, err)
+				util.Log().Debug("Error while ping slave node %q: %s", node.Model.Name, err)
 				retry++
 				if retry >= model.GetIntSetting("slave_node_retry", 3) {
-					util.Log().Debug("从机节点 [%s] Ping 重试已达到最大限制,将从机节点标记为不可用", node.Model.Name)
+					util.Log().Debug("Retry threshold for pinging slave node %q exceeded, mark it as offline.", node.Model.Name)
 					node.changeStatus(false)
 
 					if !recoverMode {
 						// 启动恢复监控循环
-						util.Log().Debug("从机节点 [%s] 进入恢复模式", node.Model.Name)
+						util.Log().Debug("Slave node %q entered recovery mode.", node.Model.Name)
 						pingTicker = recoverDuration
 						recoverMode = true
 					}
 				}
 			} else {
 				if recoverMode {
-					util.Log().Debug("从机节点 [%s] 复活", node.Model.Name)
+					util.Log().Debug("Slave node %q recovered.", node.Model.Name)
 					pingTicker = tickDuration
 					recoverMode = false
 					isFirstLoop = true
 				}
 
-				util.Log().Debug("从机节点 [%s] 状态: %s", node.Model.Name, res)
+				util.Log().Debug("Status of slave node %q: %s", node.Model.Name, res)
 				node.changeStatus(true)
 				retry = 0
 			}
 
 		case <-node.close:
-			util.Log().Debug("从机节点 [%s] 收到关闭信号", node.Model.Name)
+			util.Log().Debug("Slave node %q received shutdown signal.", node.Model.Name)
 			break loop
 		}
 	}
@@ -421,7 +421,7 @@ func RemoteCallback(url string, body serializer.UploadCallback) error {
 		Data: body,
 	})
 	if err != nil {
-		return serializer.NewError(serializer.CodeCallbackError, "无法编码回调正文", err)
+		return serializer.NewError(serializer.CodeCallbackError, "Failed to encode callback content", err)
 	}
 
 	resp := request.GeneralClient.Request(
@@ -433,13 +433,13 @@ func RemoteCallback(url string, body serializer.UploadCallback) error {
 	)
 
 	if resp.Err != nil {
-		return serializer.NewError(serializer.CodeCallbackError, "从机无法发起回调请求", resp.Err)
+		return serializer.NewError(serializer.CodeCallbackError, "Slave cannot send callback request", resp.Err)
 	}
 
 	// 解析回调服务端响应
 	response, err := resp.DecodeResponse()
 	if err != nil {
-		msg := fmt.Sprintf("从机无法解析主机返回的响应 (StatusCode=%d)", resp.Response.StatusCode)
+		msg := fmt.Sprintf("Slave cannot parse callback response from master (StatusCode=%d).", resp.Response.StatusCode)
 		return serializer.NewError(serializer.CodeCallbackError, msg, err)
 	}
 
diff --git a/pkg/serializer/error.go b/pkg/serializer/error.go
index 118aa81..b18d6de 100644
--- a/pkg/serializer/error.go
+++ b/pkg/serializer/error.go
@@ -190,6 +190,8 @@ const (
 	CodeIncorrectPassword = 40069
 	// 分享无法预览
 	CodeDisabledSharePreview = 40070
+	// 签名无效
+	CodeInvalidSign = 40071
 	// CodeDBError 数据库操作失败
 	CodeDBError = 50001
 	// CodeEncryptError 加密失败