feat(i18n): add locale dictionaries and pilot surfaces
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
import { describe, expect, it } from "vitest"
|
||||
|
||||
import { dictionaries, getDictionary } from "@/i18n/dictionaries"
|
||||
import { SUPPORTED_LOCALES } from "@/i18n/locales"
|
||||
|
||||
describe("i18n dictionaries", () => {
|
||||
it("provides dictionaries for every supported locale and no extra locales", () => {
|
||||
expect(Object.keys(dictionaries).sort()).toEqual(
|
||||
[...SUPPORTED_LOCALES].sort(),
|
||||
)
|
||||
})
|
||||
|
||||
it("returns localized login copy for English and Spanish", () => {
|
||||
expect(getDictionary("en").login).toEqual({
|
||||
title: "Sign In",
|
||||
usernameLabel: "Username",
|
||||
passwordLabel: "Password",
|
||||
submitLabel: "Sign In",
|
||||
})
|
||||
|
||||
expect(getDictionary("es").login).toEqual({
|
||||
title: "Iniciar sesión",
|
||||
usernameLabel: "Usuario",
|
||||
passwordLabel: "Contraseña",
|
||||
submitLabel: "Iniciar sesión",
|
||||
})
|
||||
})
|
||||
|
||||
it("keeps dashboard home dictionary keys aligned across locales", () => {
|
||||
expect(getDictionary("en").dashboardHome).toEqual({
|
||||
heading: "Dashboard",
|
||||
cards: {
|
||||
items: {
|
||||
title: "Total Items",
|
||||
countLabel: "Total",
|
||||
},
|
||||
assets: {
|
||||
title: "Total Assets",
|
||||
countLabel: "Total",
|
||||
},
|
||||
recipients: {
|
||||
title: "Total Recipients",
|
||||
countLabel: "Total",
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
expect(getDictionary("es").dashboardHome).toEqual({
|
||||
heading: "Panel de control",
|
||||
cards: {
|
||||
items: {
|
||||
title: "Total de artículos",
|
||||
countLabel: "Total",
|
||||
},
|
||||
assets: {
|
||||
title: "Total de activos",
|
||||
countLabel: "Total",
|
||||
},
|
||||
recipients: {
|
||||
title: "Total de destinatarios",
|
||||
countLabel: "Total",
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("has exact structural parity between English and Spanish dictionaries", () => {
|
||||
expect(extractKeyPaths(getDictionary("es"))).toEqual(
|
||||
extractKeyPaths(getDictionary("en")),
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
function extractKeyPaths(value: unknown, prefix = ""): string[] {
|
||||
if (!isPlainObject(value)) return [prefix]
|
||||
|
||||
return Object.keys(value)
|
||||
.sort()
|
||||
.flatMap((key) =>
|
||||
extractKeyPaths(value[key], prefix ? `${prefix}.${key}` : key),
|
||||
)
|
||||
}
|
||||
|
||||
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
||||
return typeof value === "object" && value !== null && !Array.isArray(value)
|
||||
}
|
||||
Reference in New Issue
Block a user