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.
31 lines
811 B
TypeScript
31 lines
811 B
TypeScript
/** zh base dictionary for the common namespace: cross-feature standard words. */
|
|
export const zh = {
|
|
'ok': '确定',
|
|
'cancel': '取消',
|
|
'close': '关闭',
|
|
'copy': '复制',
|
|
'copied': '复制成功',
|
|
'retry': '重试',
|
|
'loading': '加载中…',
|
|
'load.failed': '加载失败',
|
|
'submit': '提交',
|
|
'submitting': '正在提交…',
|
|
'next': '下一步',
|
|
'previous': '上一步',
|
|
'skip': '跳过',
|
|
'delete': '删除',
|
|
'edit': '编辑',
|
|
'save': '保存',
|
|
'search': '搜索',
|
|
'more': '更多',
|
|
'collapse': '收起',
|
|
'expand': '展开',
|
|
'back': '返回',
|
|
'unknown': '未知',
|
|
'none': '无',
|
|
'truncated': '已截断',
|
|
} satisfies Record<string, string>
|
|
|
|
/** The common vocabulary key union (zh is the key-set source of truth). */
|
|
export type CommonKey = keyof typeof zh
|