# `LOCALE_DESCRIPTORS`, `DEFAULT_LOCALES`, `DefaultLocale` ## Purpose These three exports together define the built-in supported-locale inventory for the Suaveplan i18n family. `DEFAULT_LOCALES` is the ordered tuple of locale codes that ship in every bundle by default; `DefaultLocale` is the string-literal union derived from that tuple (consumers can use it as a strongly-typed parameter); and `LOCALE_DESCRIPTORS` is the per-locale display-metadata table (English `name`, locale-native `nativeName`, text `direction`). The data lets a UI render a locale picker, a sitemap generator emit `` tags, and the locale detector resolve fallback chains — all without round-tripping through external locale data. ## Features - 16 default locales: `en`, `es`, `fr`, `de`, `cy`, `zh`, `ar`, `ru`, `pl`, `ja`, `ko`, `pt`, `it`, `nl`, `he`, `fa` - Cross-checked invariant — every `DEFAULT_LOCALES` entry has a descriptor; every descriptor's `direction` agrees with the locale's membership in `RTL_LOCALES` - Static, tree-shakeable, zero-dependency ## Usage: Basic Example ```ts import { LOCALE_DESCRIPTORS } from "@suaveplan/i18n-shared"; const meta = LOCALE_DESCRIPTORS["ar"]; console.log(meta.name); // "Arabic" console.log(meta.nativeName); // "العربية" console.log(meta.direction); // "rtl" ``` ## Usage: Advanced Example ```ts import { DEFAULT_LOCALES, type DefaultLocale, LOCALE_DESCRIPTORS, } from "@suaveplan/i18n-shared/constants/locale-descriptors"; // Render a typed locale picker function buildPicker(): Array<{ value: DefaultLocale; label: string }> { return DEFAULT_LOCALES.map((code) => { const descriptor = LOCALE_DESCRIPTORS[code]; return { value: code, label: `${descriptor?.nativeName ?? code} (${descriptor?.name ?? "?"})`, }; }); } // DefaultLocale narrows at the API boundary function setLocale(locale: DefaultLocale): void { document.documentElement.lang = locale; const direction = LOCALE_DESCRIPTORS[locale]?.direction ?? "ltr"; document.documentElement.dir = direction; } ``` ## API Reference ### `DEFAULT_LOCALES: readonly [...]` Ordered tuple of 16 ISO 639-1 codes. Iteration order is the canonical default order used when the locale detector exhausts its preference-list inputs. ### `DefaultLocale` Type alias equal to `(typeof DEFAULT_LOCALES)[number]`. Use as a parameter type to constrain a function to the built-in locale set. ### `LOCALE_DESCRIPTORS: Record` Per-locale display metadata. Lookup is O(1). Returns `undefined` for unknown codes — consumers handle the miss. ## Implementation Notes - The table is keyed on the short ISO 639-1 code (NOT the canonical BCP-47 tag) so consumers using `LOCALE_BCP47_MAP` for runtime formatting can still read the descriptor with the un-mapped key. - `nativeName` values use the script's actual code points (e.g. `"العربية"`, `"中文"`) — file encoding MUST be UTF-8. - The list is intentionally small — adding a locale is a deliberate product decision, and the cross-file invariant test catches drift with `RTL_LOCALES`.