212 lines
5.6 KiB
TypeScript
212 lines
5.6 KiB
TypeScript
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("provides localized language switcher copy for English and Spanish", () => {
|
|
expect(getDictionary("en").common.languageSwitcher).toEqual({
|
|
label: "Language",
|
|
options: {
|
|
en: "English",
|
|
es: "Spanish",
|
|
},
|
|
})
|
|
|
|
expect(getDictionary("es").common.languageSwitcher).toEqual({
|
|
label: "Idioma",
|
|
options: {
|
|
en: "Inglés",
|
|
es: "Español",
|
|
},
|
|
})
|
|
})
|
|
|
|
it("provides localized shell and common copy for English and Spanish", () => {
|
|
expect(getDictionary("en").layout).toEqual({
|
|
sidebar: {
|
|
home: "Home",
|
|
inventory: "Inventory",
|
|
items: "Items",
|
|
categories: "Categories",
|
|
assets: "Assets",
|
|
recipients: "Recipients",
|
|
movements: "Movements",
|
|
assignments: "Assignments",
|
|
users: "Users",
|
|
},
|
|
navbar: {
|
|
accountLabel: "My Account",
|
|
},
|
|
addMenu: {
|
|
add: "Add",
|
|
import: "Import",
|
|
category: "Category",
|
|
item: "Item",
|
|
asset: "Asset",
|
|
recipient: "Recipient",
|
|
assignment: "Assignment",
|
|
},
|
|
resetDatabase: {
|
|
idle: "Reset Database",
|
|
loading: "Resetting...",
|
|
successToast: "Database reset successfully",
|
|
errorToast: "Error resetting database",
|
|
},
|
|
logout: {
|
|
label: "Sign Out",
|
|
},
|
|
})
|
|
|
|
expect(getDictionary("es").layout).toEqual({
|
|
sidebar: {
|
|
home: "Inicio",
|
|
inventory: "Inventario",
|
|
items: "Artículos",
|
|
categories: "Categorías",
|
|
assets: "Activos",
|
|
recipients: "Destinatarios",
|
|
movements: "Movimientos",
|
|
assignments: "Asignaciones",
|
|
users: "Usuarios",
|
|
},
|
|
navbar: {
|
|
accountLabel: "Mi cuenta",
|
|
},
|
|
addMenu: {
|
|
add: "Añadir",
|
|
import: "Importar",
|
|
category: "Categoría",
|
|
item: "Artículo",
|
|
asset: "Activo",
|
|
recipient: "Destinatario",
|
|
assignment: "Asignación",
|
|
},
|
|
resetDatabase: {
|
|
idle: "Reiniciar base de datos",
|
|
loading: "Reiniciando...",
|
|
successToast: "Base de datos reiniciada correctamente",
|
|
errorToast: "Error al reiniciar la base de datos",
|
|
},
|
|
logout: {
|
|
label: "Cerrar sesión",
|
|
},
|
|
})
|
|
|
|
expect(getDictionary("en").common.search).toEqual({
|
|
placeholder: "Search...",
|
|
label: "Search",
|
|
clearLabel: "Clear search",
|
|
})
|
|
expect(getDictionary("es").common.search).toEqual({
|
|
placeholder: "Buscar...",
|
|
label: "Buscar",
|
|
clearLabel: "Limpiar búsqueda",
|
|
})
|
|
|
|
expect(getDictionary("en").common.pagination).toEqual({
|
|
summaryPrefix: "Showing page",
|
|
summarySeparator: "of",
|
|
previous: "Previous",
|
|
next: "Next",
|
|
})
|
|
expect(getDictionary("es").common.pagination).toEqual({
|
|
summaryPrefix: "Mostrando página",
|
|
summarySeparator: "de",
|
|
previous: "Anterior",
|
|
next: "Siguiente",
|
|
})
|
|
|
|
expect(getDictionary("en").common.forbidden).toEqual({
|
|
title: "Access denied",
|
|
description: "You do not have permission to access this section.",
|
|
homeLink: "Back to home",
|
|
})
|
|
expect(getDictionary("es").common.forbidden).toEqual({
|
|
title: "Acceso denegado",
|
|
description: "No tienes permisos para acceder a esta sección.",
|
|
homeLink: "Volver al inicio",
|
|
})
|
|
})
|
|
|
|
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)
|
|
}
|