ConusAI vendor v0.1.0-beta.114
ci / gate (push) Waiting to run

This commit is contained in:
ConusAI vendor v0.1.0-beta.114
2026-11-14 09:56:45 +00:00
commit 1ce8d23c35
867 changed files with 122104 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
// The labels each component takes, built from a message lookup. Every key this module's pages use is
// named here or in pages.tsx, so `__tests__/i18n.test.ts` can run these builders against the
// catalogues and fail on a key either language lacks.
//
// `t` takes a key relative to the module (`form.submit`); the page binds it to
// `i18n.message("crm." + key)`. `refusals` is the kit's text for each business refusal in the reader's
// language (`businessRefusalNotices`), which a form shows when the service refuses.
import { CONTACT_KINDS, CONTACT_PURPOSES } from "../contract/constants.js"
import type { ContactFormLabels } from "./contact-form.js"
import type { ContactsLabels } from "./contacts.js"
import type { PartyFormLabels } from "./party-form.js"
import type { PartyListLabels } from "./party-list.js"
export type Translate = (key: string, values?: Record<string, string | number>) => string
export type Refusals = Readonly<Record<string, string>>
const ALL_KINDS = ["postal", "email", "phone", "web", "peppol_endpoint"] as const
const purposeNames = (t: Translate) =>
Object.fromEntries(
CONTACT_PURPOSES.map((purpose) => [purpose, t(`purposes.${purpose}`)]),
) as ContactsLabels["purposeNames"]
export function partyFormLabels(t: Translate, refusals: Refusals): PartyFormLabels {
return {
heading: t("form.heading"),
kind: t("form.kind"),
person: t("kinds.person"),
organization: t("kinds.organization"),
displayName: t("form.displayName"),
legalName: t("form.legalName"),
country: t("form.country"),
countryHint: t("form.countryHint"),
linkSelf: t("form.linkSelf"),
submit: t("form.submit"),
busy: t("form.busy"),
refusals,
}
}
export function partyListLabels(t: Translate): PartyListLabels {
return {
caption: t("parties.caption"),
empty: t("parties.empty"),
name: t("parties.name"),
kind: t("parties.kind"),
country: t("parties.country"),
person: t("kinds.person"),
organization: t("kinds.organization"),
// The placeholder is the component's to fill, so it is passed through untouched.
open: t("parties.open", { name: "{name}" }),
search: t("parties.search"),
}
}
export function contactsLabels(t: Translate, count: number): ContactsLabels {
return {
title: t("contacts.title"),
count: t("contacts.count", { count }),
caption: t("contacts.caption"),
empty: t("contacts.empty"),
kind: t("contacts.kind"),
value: t("contacts.value"),
purposes: t("contacts.purposes"),
primary: t("contacts.primary"),
erased: t("contacts.erased"),
yes: t("contacts.yes"),
no: t("contacts.no"),
kinds: Object.fromEntries(ALL_KINDS.map((kind) => [kind, t(`contactKinds.${kind}`)])) as ContactsLabels["kinds"],
purposeNames: purposeNames(t),
}
}
export function contactFormLabels(t: Translate, refusals: Refusals): ContactFormLabels {
return {
heading: t("contactForm.heading"),
kind: t("contactForm.kind"),
value: t("contactForm.value"),
purposes: t("contactForm.purposes"),
primary: t("contactForm.primary"),
submit: t("contactForm.submit"),
busy: t("contactForm.busy"),
kinds: Object.fromEntries(
CONTACT_KINDS.map((kind) => [kind, t(`contactKinds.${kind}`)]),
) as ContactFormLabels["kinds"],
purposeNames: purposeNames(t),
refusals,
}
}