/** * Language packs for the UI chrome - the `@llselect/core/i18n` subpath. Pure * data, tree-shakeable; spread a pack into the `uiTranslationPack` setting. * @module @llselect/core/i18n */ /** * All chrome strings of one select instance. * - `placeholder` is NOT here: it is app copy, not chrome (language packs * never set it). * - Static strings are plain strings; parameterized messages are functions * taking RESOLVED primitives (never the item type `T`), so a language pack * can implement them. Keys are message ids (no `Fn` suffix); see * naming-conventions.md s7a.4. * @group Pack contract */ export interface LLSelectUiTranslationPack { /** * Default text shown in the trigger while nothing is chosen, used only when * the app did not pass the `placeholder` setting. An explicit `placeholder` * always wins (app copy beats chrome); this key just localizes the library * fallback. */ triggerPlaceholder: string; /** * Fallback accessible name (`aria-label`) of the filter input, used only * when the app supplies neither `ariaLabel` nor `ariaLabelledBy` (the field * name then replaces this generic operation label). The input has no * visible label, so screen readers rely on one of these. */ filterInputAriaLabel: string; /** * Placeholder text of the filter input. Also teaches the Esc behavior * (first Esc clears the filter). `null` = no placeholder (pass * `uiTranslationPack: { filterInputPlaceholder: null }` to remove the default). */ filterInputPlaceholder: string | null; /** * Message shown (and announced via `role="status"`) when the visible item * list is empty - a filter matched nothing, or there are no items at all. */ popupListNoResults: string; /** Accessible name (`aria-label`) of the trigger's clear (x) button (`clearable`). */ triggerClearButtonAriaLabel: string; /** * itemText (already `itemToString`-resolved) -> the accessible name * (`aria-label`) of that tag's remove button. `'tags'` mode only. */ tagRemoveButtonAriaLabel: (itemText: string) => string; /** * Count summary shown in the multi trigger. Called only when * `chosenCount > 0` (an empty selection shows `placeholder` instead). */ triggerCountSummary: (chosenCount: number, totalCount: number) => string; /** * Text of the multi choose-all row (`chooseAllRow` setting): both the * visible text and the accessible name. Counts refer to the subset the * row acts on: `toggleAllVisible` documents it. */ chooseAllRowText: (chosenCount: number, totalCount: number) => string; } import { ar } from './i18n/ar.js'; import { bg } from './i18n/bg.js'; import { bn } from './i18n/bn.js'; import { ca } from './i18n/ca.js'; import { cs } from './i18n/cs.js'; import { da } from './i18n/da.js'; import { de } from './i18n/de.js'; import { el } from './i18n/el.js'; import { en } from './i18n/en.js'; import { es } from './i18n/es.js'; import { et } from './i18n/et.js'; import { fa } from './i18n/fa.js'; import { fi } from './i18n/fi.js'; import { fil } from './i18n/fil.js'; import { fr } from './i18n/fr.js'; import { ga } from './i18n/ga.js'; import { he } from './i18n/he.js'; import { hi } from './i18n/hi.js'; import { hr } from './i18n/hr.js'; import { hu } from './i18n/hu.js'; import { id } from './i18n/id.js'; import { is } from './i18n/is.js'; import { it } from './i18n/it.js'; import { ja } from './i18n/ja.js'; import { kk } from './i18n/kk.js'; import { km } from './i18n/km.js'; import { ko } from './i18n/ko.js'; import { lt } from './i18n/lt.js'; import { lv } from './i18n/lv.js'; import { mn } from './i18n/mn.js'; import { ms } from './i18n/ms.js'; import { my } from './i18n/my.js'; import { nanLatnTailo } from './i18n/nanLatnTailo.js'; import { nanTW } from './i18n/nanTW.js'; import { nb } from './i18n/nb.js'; import { nl } from './i18n/nl.js'; import { pl } from './i18n/pl.js'; import { pt } from './i18n/pt.js'; import { ro } from './i18n/ro.js'; import { ru } from './i18n/ru.js'; import { sk } from './i18n/sk.js'; import { sl } from './i18n/sl.js'; import { sr } from './i18n/sr.js'; import { sv } from './i18n/sv.js'; import { sw } from './i18n/sw.js'; import { ta } from './i18n/ta.js'; import { th } from './i18n/th.js'; import { tr } from './i18n/tr.js'; import { uk } from './i18n/uk.js'; import { ur } from './i18n/ur.js'; import { vi } from './i18n/vi.js'; import { yue } from './i18n/yue.js'; import { zhCN } from './i18n/zhCN.js'; import { zhTW } from './i18n/zhTW.js'; export { ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fil, fr, ga, he, hi, hr, hu, id, is, it, ja, kk, km, ko, lt, lv, mn, ms, my, nanLatnTailo, nanTW, nb, nl, pl, pt, ro, ru, sk, sl, sr, sv, sw, ta, th, tr, uk, ur, vi, yue, zhCN, zhTW }; /** * All packs keyed by their BCP 47 tag, for `navigator.language`-style lookup. * - Tags are the MINIMAL sufficient form (BCP 47 / CLDR convention): `ja` and * `en` carry no region (the strings are not region-specific); `zh-TW` / * `zh-CN` must (Traditional vs Simplified differ entirely); `en` / `es` / * `pt` are deliberately unsplit (these strings do not differ by region). * Named exports stay camelCase (`zhTW`, `nanTW`) only because `-` is * illegal in a JS identifier. * - Alias keys map onto another tag's pack object: `no` -> `nb` (macrolanguage * tag browsers still report), `zh-HK` -> `zh-TW` (formal written Chinese; * these strings do not differ - written VERNACULAR Cantonese is the * separate primary tag `yue`). * - Script / orthography variants of one language differ by subtag, not by * language id: `nan-TW` (Han) vs `nan-Latn-tailo` (Tai-lo romanization). * - Browsers may report longer or different tags (`en-GB`, `ja-JP`, * `zh-Hant-TW`), so negotiate instead of indexing blindly - e.g. try the * full tag, then the base language, then fall back: * `uiTranslationPackByLocale[tag] ?? uiTranslationPackByLocale[tag.split('-')[0]!] ?? en`. * @group Language packs */ export declare const uiTranslationPackByLocale: Record; //# sourceMappingURL=i18n.d.ts.map