Skip to content

@gram-lang/i18n

Normalisation partagée des unités/du temps et dictionnaires de chaînes UI, utilisés en interne à travers le pipeline (le parser ne normalise pas les unités — cela se passe dans le moteur de mise à l'échelle de @gram-lang/kitchen et dans la standardisation de masse de @gram-lang/analyzer), afin que "càs", "tbsp", et "cuillère à soupe" soient tous reconnus comme la même unité, quelle que soit la locale dans laquelle une recette ou une entrée de base de données a été écrite.

Unités canoniques & alias

normalizeUnit fait correspondre tout alias reconnu (anglais ou français, insensible à la casse) à sa forme canonique courte :

CanoniqueAlias
tspcàc, cac, c.à.c, cuillère à café, cuillères à café, cuillere a cafe, cuilleres a cafe
tbspcàs, cas, c.à.s, cuillère à soupe, cuillères à soupe, cuillere a soupe, cuilleres a soupe
tadsoupçon, soupcons
dashtrait
pinchpincée, pincee, pincées, pincees
smidgenpoussière, poussiere, poussières, poussieres
dropgoutte, gouttes
fl ozonce liquide, onces liquides
mlmillilitre, millilitres
clcentilitre, centilitres
dldécilitre, décilitres, decilitre, decilitres
llitre, litres
tassetasse, tasses
mgmilligramme, milligrammes
ggramme, grammes
kgkilo, kilos, kilogramme, kilogrammes
livrelivre, livres
ozonce, onces
typescript
function normalizeUnit(rawUnit: string | undefined | null, lang?: string): string
typescript
import { normalizeUnit } from '@gram-lang/i18n';

normalizeUnit('càs');              // "tbsp"
normalizeUnit('Tablespoons');      // "tbsp"
normalizeUnit('kilo', 'fr');       // "kg" (recherche scopée par langue, avec repli sur le global)

Une entrée non reconnue est retournée en minuscules et sans espaces superflus, inchangée.

Unités de temps

Le même schéma de normalisation par alias, appliqué aux durées :

CanoniqueAlias
dj, jour, jours
hheure, heures
mmin, mins, minute, minutes
ssec, secs, seconde, secondes
typescript
function resolveTimeUnit(unit?: string | null, lang?: string): string
typescript
import { resolveTimeUnit } from '@gram-lang/i18n';

resolveTimeUnit('minutes'); // "m"
resolveTimeUnit('heures', 'fr'); // "h"

Catégories d'ingrédients par défaut

Utilisées par gram shop et d'autres consommateurs pour grouper une liste de courses par famille culinaire quand l'entrée de base de données d'un ingrédient n'a pas de category explicite :

Catégories par défaut
Légumes
Fruits
Viandes
Poissons & Fruits de mer
Crémerie
Céréales
Légumineuses
Noix & Graines
Huiles
Herbes
Épices
Condiments
Sucres
Boissons
Autres

CATEGORY_KEYS exporte les clés stables et invariantes par langue (produce, dairy, meat, pantry, ...), et getCategoryLabels(lang) résout ces clés en libellés traduits :

typescript
function getDefaultCategories(lang?: string): string[] // par défaut 'en'
function getCategoryLabels(lang?: string): Record<CategoryKey, string>
typescript
import { getDefaultCategories, getCategoryLabels, CATEGORY_KEYS } from '@gram-lang/i18n';

getDefaultCategories('fr'); // ["Légumes", "Fruits", "Viandes", ...]
getCategoryLabels('fr').produce; // "Légumes"

Tables de conversion d'unités

@gram-lang/i18n sert de source de vérité unique pour les facteurs de conversion intra-famille (UNIT_CONVERSIONS) et les multiplicateurs de durée en minutes (TIME_TO_MINUTES) :

typescript
import { UNIT_CONVERSIONS, TIME_TO_MINUTES } from '@gram-lang/i18n';

UNIT_CONVERSIONS.mass.map.kg; // 1000 (grammes)
UNIT_CONVERSIONS.volume.map.tbsp; // 14.7868 (mL)
TIME_TO_MINUTES.h; // 60 (minutes)