Complete client UI i18n migration

Adds client-side i18n support, language settings, translated UI copy, and locale parity coverage.
This commit is contained in:
chyendongnhanh338
2026-06-11 14:15:35 +08:00
committed by GitHub
parent 41cf070fd8
commit 08ebe5e7e1
199 changed files with 16426 additions and 1821 deletions
@@ -1,4 +1,5 @@
import { useCallback, useMemo } from "react";
import { useTranslation } from "react-i18next";
import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { useSessionStore } from "@/stores/session-store";
import {
@@ -9,6 +10,7 @@ import {
rejectInitDeferred,
} from "@/utils/agent-initialization";
import { planInitialAgentTimelineSync, planTimelineTailFetch } from "@/timeline/timeline-sync-plan";
import { i18n } from "@/i18n/i18next";
export const INIT_TIMEOUT_MS = 30_000;
@@ -19,6 +21,7 @@ export interface EnsureAgentIsInitializedInput {
agentId: string;
client: Pick<DaemonClient, "fetchAgentTimeline"> | null;
setAgentInitializing: SetAgentInitializing;
hostDisconnectedMessage?: string;
}
export function ensureAgentIsInitialized(input: EnsureAgentIsInitializedInput): Promise<void> {
@@ -48,7 +51,10 @@ export function ensureAgentIsInitialized(input: EnsureAgentIsInitializedInput):
if (!client) {
setAgentInitializing(agentId, false);
rejectInitDeferred(key, new Error("Host is not connected"));
rejectInitDeferred(
key,
new Error(input.hostDisconnectedMessage ?? i18n.t("workspace.terminal.hostDisconnected")),
);
return deferred.promise;
}
@@ -64,12 +70,13 @@ export interface RefreshAgentInput {
agentId: string;
client: Pick<DaemonClient, "refreshAgent" | "fetchAgentTimeline"> | null;
setAgentInitializing: SetAgentInitializing;
hostDisconnectedMessage?: string;
}
export async function refreshAgent(input: RefreshAgentInput): Promise<void> {
const { agentId, client, setAgentInitializing } = input;
if (!client) {
throw new Error("Host is not connected");
throw new Error(input.hostDisconnectedMessage ?? i18n.t("workspace.terminal.hostDisconnected"));
}
setAgentInitializing(agentId, true);
@@ -105,6 +112,7 @@ export function useAgentInitialization({
serverId: string;
client: DaemonClient | null;
}) {
const { t } = useTranslation();
const setInitializingAgents = useSessionStore((state) => state.setInitializingAgents);
const setAgentInitializing = useMemo(
() => createSetAgentInitializing(serverId, setInitializingAgents),
@@ -113,13 +121,25 @@ export function useAgentInitialization({
const ensureAgentIsInitializedCallback = useCallback(
(agentId: string): Promise<void> =>
ensureAgentIsInitialized({ serverId, agentId, client, setAgentInitializing }),
[client, serverId, setAgentInitializing],
ensureAgentIsInitialized({
serverId,
agentId,
client,
setAgentInitializing,
hostDisconnectedMessage: t("workspace.terminal.hostDisconnected"),
}),
[client, serverId, setAgentInitializing, t],
);
const refreshAgentCallback = useCallback(
(agentId: string): Promise<void> => refreshAgent({ agentId, client, setAgentInitializing }),
[client, setAgentInitializing],
(agentId: string): Promise<void> =>
refreshAgent({
agentId,
client,
setAgentInitializing,
hostDisconnectedMessage: t("workspace.terminal.hostDisconnected"),
}),
[client, setAgentInitializing, t],
);
return {