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,6 +1,7 @@
import { describe, expect, it } from "vitest";
import type { AgentModelDefinition, ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types";
import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest";
import { i18n } from "@/i18n/i18next";
import {
buildProviderSelectorProviders,
buildSelectableProviderSelectorProviders,
@@ -318,4 +319,54 @@ describe("combined model selector data", () => {
}),
).toEqual({ ok: true });
});
it("uses the active app language for utility labels", async () => {
await i18n.changeLanguage("zh-CN");
try {
const providers = buildSelectableProviderSelectorProviders([
snapshotEntry({
provider: "deepseek-tui",
label: "DeepSeek TUI",
models: [],
}),
snapshotEntry({
provider: "unavailable-provider",
status: "unavailable",
models: [],
}),
]);
expect(getAllModelLabels(providers)).toContain("默认");
expect(providers[1]?.modelSelection).toEqual({
kind: "error",
message: "不可用",
});
expect(
resolveSubmissionReadiness({
text: "",
allowsEmptyAutoSubmit: false,
providerCount: 1,
selection: {
provider: "codex",
modelId: "gpt-5.4",
availableModels: [codexModel],
isModelLoading: false,
},
autoSubmitConfig: null,
workspaceDirectory: "/repo",
hasClient: true,
}),
).toEqual({ ok: false, reason: "初始 prompt 必填" });
} finally {
await i18n.changeLanguage("en");
}
});
});
function getAllModelLabels(providers: ReturnType<typeof buildSelectableProviderSelectorProviders>) {
return providers.flatMap((provider) =>
provider.modelSelection.kind === "models"
? provider.modelSelection.rows.map((row) => row.modelLabel)
: [],
);
}