i18n(desktop): localize runtime activity titles and details to Chinese

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-20 14:17:56 +08:00
parent 5ff2e2e74c
commit 25dad49ed3
2 changed files with 60 additions and 25 deletions
@@ -211,8 +211,8 @@ export function syncRuntimeSession(next: DesktopRuntimeSessionSyncRequest | null
clearRuntimeState();
recordActivity(
"info",
"Desktop Runtime Armed",
`Client ${normalized.desktop_client?.device_name ?? normalized.desktop_client?.id ?? "unknown"} 已准备消费桌面任务。`,
"任务消费端已就绪",
`客户端 ${normalized.desktop_client?.device_name ?? normalized.desktop_client?.id ?? "未知客户端"} 已准备消费桌面任务。`,
);
}
@@ -282,7 +282,7 @@ function startRuntime(): void {
state.running = true;
setSchedulerPhase("running");
setSchedulerError(null);
recordActivity("success", "Desktop Runtime Started", "已启动 SSE、heartbeat 和 pull fallback。");
recordActivity("success", "调度节点已启动", "已启动 SSE、心跳上报和兜底拉取。");
connectEventStream();
scheduleHeartbeatLoop();
@@ -402,7 +402,7 @@ function connectEventStream(): void {
state.lastServerTime = payload.server_time;
}
recordActivity("success", "Desktop Stream Connected", "服务端已建立定向任务事件流。");
recordActivity("success", "单点事件流已连接", "服务端已建立定向任务事件流。");
});
sseClient.on("ping", () => {
@@ -437,14 +437,14 @@ function connectEventStream(): void {
const message = errorMessage(payload);
state.lastError = message;
setSchedulerError(message);
recordActivity("warn", "Desktop Stream Reconnecting", message);
recordActivity("warn", "单点事件流重连中", message);
});
sseClient.on("reconnect", (payload) => {
if (!isReconnectPayload(payload)) {
return;
}
recordActivity("info", "Desktop Stream Backoff", `将在 ${payload.delayMs}ms 后重连 SSE。`);
recordActivity("info", "单点事件流退避等待", `将在 ${payload.delayMs}ms 后重连 SSE。`);
});
state.sseClient = sseClient;
@@ -510,7 +510,7 @@ async function sendHeartbeat(source: "startup" | "timer"): Promise<void> {
setSchedulerError(null);
if (source === "startup" || previousStatus === "failed") {
recordActivity("success", "Heartbeat Healthy", "client heartbeat 已写回服务端。");
recordActivity("success", "心跳连接正常", "客户端心跳已回写到服务端。");
}
} catch (error) {
state.lastHeartbeatAt = Date.now();
@@ -526,7 +526,7 @@ async function sendHeartbeat(source: "startup" | "timer"): Promise<void> {
}
if (source === "startup" || previousStatus !== "failed") {
recordActivity("danger", "Heartbeat Failed", state.lastError);
recordActivity("danger", "心跳连接失败", state.lastError);
}
}
}
@@ -635,7 +635,7 @@ async function syncAccounts(source: "startup" | "manual"): Promise<void> {
}
if (source === "startup") {
recordActivity("info", "Accounts Synced", `已同步 ${state.accounts.length} 个桌面账号。`);
recordActivity("info", "本地账号同步", `已同步 ${state.accounts.length} 个桌面账号。`);
}
refreshAccountNames();
@@ -650,7 +650,7 @@ async function syncAccounts(source: "startup" | "manual"): Promise<void> {
return;
}
recordActivity("warn", "Account Sync Failed", message);
recordActivity("warn", "账号同步失败", message);
}
}
@@ -686,7 +686,7 @@ export async function unbindRuntimeAccount(accountId: string, syncVersion: numbe
if (matchedAccount) {
recordActivity(
"info",
"Account Unbound",
"账号已解绑",
`${matchedAccount.display_name} 已解绑,并清理了当前机器上的本地会话缓存。`,
);
}
@@ -749,7 +749,7 @@ async function leaseSpecificTask(request: PendingTaskRequest): Promise<void> {
state.lastError = errorMessage(error);
setSchedulerError(state.lastError);
recordActivity("warn", "Specific Lease Missed", `${request.taskId} 未能成功领取:${state.lastError}`);
recordActivity("warn", "指定任务领取失败", `${request.taskId} 未能成功领取:${state.lastError}`);
} finally {
if (state.leaseInFlight) {
state.leaseInFlight = false;
@@ -793,7 +793,7 @@ async function pullNextTask(): Promise<void> {
return;
}
recordActivity("warn", "Pull Fallback Failed", state.lastError);
recordActivity("warn", "兜底拉取失败", state.lastError);
} finally {
state.leaseInFlight = false;
}
@@ -823,13 +823,13 @@ async function executeLeasedTask(
routing,
attemptId: leased.attempt_id ?? null,
leaseToken: leased.lease_token,
summary: `已领取租约,开始执行 ${routing === "rabbitmq-primary" ? "MQ 唤醒" : "pull fallback"} 消费。`,
summary: `已领取租约,开始执行 ${routing === "rabbitmq-primary" ? "MQ 唤醒" : "兜底拉取"} 消费。`,
});
recordActivity(
"info",
"Task Leased",
`${taskRecord.title}当前 desktop client 领取,routing=${routing}`,
"任务已领取",
`${taskRecord.title}当前客户端领取,路由:${describeRouting(routing)}`,
);
const abortController = new AbortController();
@@ -859,10 +859,10 @@ async function executeLeasedTask(
recordActivity(
execution.status === "failed" ? "danger" : execution.status === "unknown" ? "warn" : "success",
execution.status === "failed"
? "Task Completed As Failed"
? "任务执行失败"
: execution.status === "unknown"
? "Task Completed As Unknown"
: "Task Succeeded",
? "任务执行结果待确认"
: "任务执行成功",
`${taskRecord.title} ${execution.summary}`,
);
} catch (error) {
@@ -894,7 +894,7 @@ async function executeLeasedTask(
}
noteLeaseReleased("failed");
recordActivity("danger", "Task Failed", `${taskRecord.title} 执行失败:${failureMessage || "unknown_error"}`);
recordActivity("danger", "任务执行失败", `${taskRecord.title} 执行失败:${failureMessage || "未知错误"}`);
} finally {
clearInterval(extendHandle);
state.currentExecutionAbort = null;
@@ -922,7 +922,7 @@ async function extendActiveLease(taskId: string, leaseToken: string): Promise<vo
const message = errorMessage(error);
state.lastError = message;
setSchedulerError(message);
recordActivity("warn", "Lease Extend Failed", `${taskId} 续租失败:${message}`);
recordActivity("warn", "租约续期失败", `${taskId} 续租失败:${message}`);
}
}
@@ -1145,7 +1145,7 @@ function handleAuthExpired(error: unknown): void {
const message = errorMessage(error);
state.lastError = message;
setTransportAuthState("expired");
recordActivity("danger", "Desktop Client Token Expired", message);
recordActivity("danger", "客户端令牌已过期", message);
stopRuntime();
}
@@ -1226,6 +1226,10 @@ function resolveTaskTitle(
return existing?.title ?? defaultTaskTitle(task.kind, task.platform);
}
function describeRouting(routing: RuntimeTaskRouting): string {
return routing === "rabbitmq-primary" ? "主消息队列通道" : "数据库兜底拉取";
}
function defaultTaskTitle(kind: "publish" | "monitor", platform?: string): string {
return `${kind === "publish" ? "发布任务" : "监控任务"}${platform ? ` · ${platform}` : ""}`;
}
@@ -1235,7 +1239,7 @@ function summaryFromTaskStatus(status: RuntimeTaskStatus): string {
case "queued":
return "任务已排队,等待客户端领取租约。";
case "in_progress":
return "任务正在执行,结果回写需要携带有效 lease_token。";
return "任务正在执行,结果回写需要携带有效租约凭证。";
case "succeeded":
return "任务执行成功。";
case "failed":
@@ -1250,7 +1254,7 @@ function summaryFromTaskStatus(status: RuntimeTaskStatus): string {
function summaryFromEventType(type: DesktopTaskEventMessage["type"], status: RuntimeTaskStatus): string {
switch (type) {
case "task_available":
return "RabbitMQ fanout 已送达当前客户端,等待领取租约。";
return "主消息队列事件已送达当前客户端,等待领取租约。";
case "task_leased":
return "服务端已确认租约归属。";
case "task_extended":