@panoramax/web-viewer
Version:
Panoramax web viewer for geolocated pictures
112 lines (97 loc) • 3.91 kB
JavaScript
import { autoDetectLocale, getTranslations } from "../../src/utils/i18n";
describe("autoDetectLocale", () => {
// Mock the window.navigator.languages
const originalNavigatorLanguages = window.navigator.languages;
afterEach(() => {
// Reset window.navigator.languages after each test
Object.defineProperty(window.navigator, "languages", {
value: originalNavigatorLanguages,
configurable: true
});
});
it("returns matched language from supportedTranslations", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["fr-FR", "en-US"],
configurable: true
});
const supportedTranslations = ["en", "fr", "es"];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("fr");
});
it("returns fallback when no match is found", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["de-DE", "it-IT"],
configurable: true
});
const supportedTranslations = ["en", "fr", "es"];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("en");
});
it("returns zh-Hant for Chinese Traditional locales", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["zh-TW"],
configurable: true
});
const supportedTranslations = ["zh-Hant", "zh-Hans", "en"];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("zh-Hant");
});
it("returns zh-Hans for Chinese Simplified locales", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["zh-CN"],
configurable: true
});
const supportedTranslations = ["zh-Hant", "zh-Hans", "en"];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("zh-Hans");
});
it("returns first matched language even when navigator language has region", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["fr-CA", "en-US"],
configurable: true
});
const supportedTranslations = ["fr", "en"];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("fr");
});
it("returns fallback when supportedTranslations is empty", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["fr-FR"],
configurable: true
});
const supportedTranslations = [];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("en");
});
it("handles language codes with more than two characters", () => {
Object.defineProperty(window.navigator, "languages", {
value: ["pt-BR", "en-US"],
configurable: true
});
const supportedTranslations = ["pt", "en"];
const fallback = "en";
expect(autoDetectLocale(supportedTranslations, fallback)).toBe("pt");
});
});
describe("getTranslations", () => {
it("works with default lang", () => {
const res = getTranslations("en");
expect(res.map.loading).toBe("Loading…");
});
it("works with existing lang", () => {
const res = getTranslations("fr");
expect(res.map.loading).toBe("Chargement…");
});
it("fallbacks to English if lang not found", () => {
const res = getTranslations("xn");
expect(res.map.loading).toBe("Loading…");
});
it("fallbacks to English if lang is undefined", () => {
const res = getTranslations();
expect(res.map.loading).toBe("Loading…");
});
it("works when primary lang code exists", () => {
const res = getTranslations("fr-FR");
expect(res.map.loading).toBe("Chargement…");
});
});