Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline (Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/* packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
ACCOUNT_UI_LOCALES,
|
|
htmlLangForLocale,
|
|
isUiLocale,
|
|
normalizeUiLocale,
|
|
resolveUiLocale,
|
|
UI_LOCALE_LABELS,
|
|
UI_LOCALES,
|
|
} from "./ui-locale";
|
|
|
|
describe("UI_LOCALES", () => {
|
|
it("offers every locale with a mobile catalog", () => {
|
|
expect([...UI_LOCALES]).toEqual(["en", "zh-CN", "ru"]);
|
|
expect(Object.keys(UI_LOCALE_LABELS).sort()).toEqual(["en", "ru", "zh-CN"]);
|
|
expect(isUiLocale("de")).toBe(false);
|
|
expect(isUiLocale("ko")).toBe(false);
|
|
expect(isUiLocale("tr")).toBe(false);
|
|
expect(isUiLocale("hi")).toBe(false);
|
|
expect(isUiLocale("pt-BR")).toBe(false);
|
|
expect(isUiLocale("ru")).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("ACCOUNT_UI_LOCALES", () => {
|
|
it("limits the Account picker to English and Simplified Chinese", () => {
|
|
expect([...ACCOUNT_UI_LOCALES]).toEqual(["en", "zh-CN"]);
|
|
expect(ACCOUNT_UI_LOCALES).not.toContain("ru");
|
|
});
|
|
});
|
|
|
|
describe("normalizeUiLocale", () => {
|
|
it("maps regional tags onto supported locales", () => {
|
|
expect(normalizeUiLocale("en-US")).toBe("en");
|
|
expect(normalizeUiLocale("zh-CN")).toBe("zh-CN");
|
|
expect(normalizeUiLocale("zh")).toBe("zh-CN");
|
|
expect(normalizeUiLocale("zh-Hans")).toBe("zh-CN");
|
|
expect(normalizeUiLocale("zh-SG")).toBe("zh-CN");
|
|
expect(normalizeUiLocale("ru-RU")).toBe("ru");
|
|
expect(normalizeUiLocale("ru_KZ")).toBe("ru");
|
|
});
|
|
|
|
it("does not fold Traditional Chinese into Simplified", () => {
|
|
expect(normalizeUiLocale("zh-TW")).toBe("en");
|
|
expect(normalizeUiLocale("zh-HK")).toBe("en");
|
|
expect(normalizeUiLocale("zh-Hant")).toBe("en");
|
|
});
|
|
|
|
it("falls back to English for unknown locales and web-only languages", () => {
|
|
expect(normalizeUiLocale("fr-FR")).toBe("en");
|
|
expect(normalizeUiLocale("de")).toBe("en");
|
|
expect(normalizeUiLocale("de-DE")).toBe("en");
|
|
expect(normalizeUiLocale("ko")).toBe("en");
|
|
expect(normalizeUiLocale("ko-KR")).toBe("en");
|
|
expect(normalizeUiLocale("tr")).toBe("en");
|
|
expect(normalizeUiLocale("hi")).toBe("en");
|
|
expect(normalizeUiLocale("pt")).toBe("en");
|
|
expect(normalizeUiLocale("pt-BR")).toBe("en");
|
|
expect(normalizeUiLocale("")).toBe("en");
|
|
expect(normalizeUiLocale(null)).toBe("en");
|
|
});
|
|
});
|
|
|
|
describe("htmlLangForLocale", () => {
|
|
it("keeps Simplified Chinese on zh-CN", () => {
|
|
expect(htmlLangForLocale("zh-CN")).toBe("zh-CN");
|
|
expect(htmlLangForLocale("en")).toBe("en");
|
|
});
|
|
});
|
|
|
|
describe("resolveUiLocale", () => {
|
|
it("prefers the saved choice over env and device language", () => {
|
|
expect(
|
|
resolveUiLocale({
|
|
stored: "zh-CN",
|
|
envDefault: "zh-CN",
|
|
deviceLanguage: "en-US",
|
|
}),
|
|
).toBe("zh-CN");
|
|
});
|
|
|
|
it("uses the env default, then device language, then English", () => {
|
|
expect(
|
|
resolveUiLocale({
|
|
stored: null,
|
|
envDefault: "zh-CN",
|
|
deviceLanguage: "en-US",
|
|
}),
|
|
).toBe("zh-CN");
|
|
expect(
|
|
resolveUiLocale({
|
|
stored: null,
|
|
envDefault: null,
|
|
deviceLanguage: "zh-CN",
|
|
}),
|
|
).toBe("zh-CN");
|
|
expect(
|
|
resolveUiLocale({
|
|
stored: null,
|
|
envDefault: null,
|
|
deviceLanguage: null,
|
|
}),
|
|
).toBe("en");
|
|
});
|
|
});
|