Registrations declare a dictionary namespace (locale: NS) and the renderer
synthesizes a typed t prop for the entry's component from the installed
LocaleFace; the seat binding is re-derived per locale revision, so a language
switch hands out fresh t references and memoized consumers re-render through
ordinary shallow comparison. LocaleNamespaceMap is the declare-merge table
(namespace -> dictionary key union); TranslateNS<'ns'> is the
namespace-addressed translate type (namespace keys plus the shared common
vocabulary), carried by the t seat and by the locale service's typed bind.
LocaleService implements the face (lookup ns -> common -> zh -> key,
revision-carrying snapshots with subscriber isolation) and installs it
through the boot-once slots.installLocale seam, mirroring the renderer
install. The typed register(ns, {zh, en}) overload checks each dictionary
against the namespace's key union and requires every shipped locale, so a
missing or extra key and an unbalanced translation are compile errors.
Dictionary registration bumps the face revision without emitting
locale/change — the event now means exactly 'the active locale switched',
so registration-heavy boot cannot storm event listeners.
30 lines
722 B
TypeScript
30 lines
722 B
TypeScript
import type { CommonKey } from './zh.ts'
|
|
|
|
/** en base dictionary for the common namespace, checked complete against the zh key set. */
|
|
export const en = {
|
|
'ok': 'OK',
|
|
'cancel': 'Cancel',
|
|
'close': 'Close',
|
|
'copy': 'Copy',
|
|
'copied': 'Copied',
|
|
'retry': 'Retry',
|
|
'loading': 'Loading…',
|
|
'load.failed': 'Failed to load',
|
|
'submit': 'Submit',
|
|
'submitting': 'Submitting…',
|
|
'next': 'Next',
|
|
'previous': 'Previous',
|
|
'skip': 'Skip',
|
|
'delete': 'Delete',
|
|
'edit': 'Edit',
|
|
'save': 'Save',
|
|
'search': 'Search',
|
|
'more': 'More',
|
|
'collapse': 'Collapse',
|
|
'expand': 'Expand',
|
|
'back': 'Back',
|
|
'unknown': 'Unknown',
|
|
'none': 'None',
|
|
'truncated': 'Truncated',
|
|
} satisfies Record<CommonKey, string>
|