feat(ui): localize UI strings

Converts hardcoded UI copy to i18n keys across the app, adds global translation for non-component modules, and splits the English catalog into feature modules with duplicate-key detection.
This commit is contained in:
Shantur Rathore
2026-01-26 12:26:12 +00:00
parent 33939f4096
commit 5b1e21345f
88 changed files with 2080 additions and 822 deletions

View File

@@ -6,14 +6,20 @@ export interface KeyboardShortcut {
alt?: boolean
}
export type Resolvable<T> = T | (() => T)
export function resolveResolvable<T>(value: Resolvable<T>): T {
return typeof value === "function" ? (value as () => T)() : value
}
export interface Command {
id: string
label: string | (() => string)
description: string
keywords?: string[]
label: Resolvable<string>
description: Resolvable<string>
keywords?: Resolvable<string[]>
shortcut?: KeyboardShortcut
action: () => void | Promise<void>
category?: string
category?: Resolvable<string>
}
export function createCommandRegistry() {
@@ -47,11 +53,15 @@ export function createCommandRegistry() {
const lowerQuery = query.toLowerCase()
return getAll().filter((cmd) => {
const label = typeof cmd.label === "function" ? cmd.label() : cmd.label
const label = resolveResolvable(cmd.label)
const description = resolveResolvable(cmd.description)
const keywords = cmd.keywords ? resolveResolvable(cmd.keywords) : undefined
const category = cmd.category ? resolveResolvable(cmd.category) : undefined
const labelMatch = label.toLowerCase().includes(lowerQuery)
const descMatch = cmd.description.toLowerCase().includes(lowerQuery)
const keywordMatch = cmd.keywords?.some((k) => k.toLowerCase().includes(lowerQuery))
return labelMatch || descMatch || keywordMatch
const descMatch = description.toLowerCase().includes(lowerQuery)
const keywordMatch = keywords?.some((k) => k.toLowerCase().includes(lowerQuery))
const categoryMatch = category?.toLowerCase().includes(lowerQuery)
return labelMatch || descMatch || keywordMatch || categoryMatch
})
}