evOo-local/apps/mobile/lib/ui-locale.test.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
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.
2026-09-20 17:15:16 +02:00

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");
});
});