feat(i18n): add toast i18n with en/zh locale and plugin config support

- Add src/locales/ with en baseline and zh overrides (Partial<Record> fallback)
- Add src/shared/i18n.ts with initI18n/t/setLocale/getLocale (LANG env auto-detect)
- Add I18nConfigSchema with locale field to plugin config
- Internationalize 13 hardcoded strings in task-toast-manager
- Add 18 unit tests for i18n module
- Pin manager tests to en locale for determinism
This commit is contained in:
leeyazhou
2026-05-09 14:39:21 +08:00
parent 49066e7ecc
commit 9dc9d77904
12 changed files with 377 additions and 16 deletions
+1
View File
@@ -6,6 +6,7 @@ export type {
OhMyOpenCodeConfig,
AgentOverrideConfig,
AgentOverrides,
I18nConfig,
McpName,
AgentName,
HookName,
+1
View File
@@ -13,6 +13,7 @@ export * from "./schema/fallback-models"
export * from "./schema/git-env-prefix"
export * from "./schema/git-master"
export * from "./schema/hooks"
export * from "./schema/i18n"
export * from "./schema/keyword-detector"
export * from "./schema/model-capabilities"
export * from "./schema/notification"
+8
View File
@@ -0,0 +1,8 @@
import { z } from "zod"
export const I18nConfigSchema = z.object({
/** Override auto-detected locale (e.g. "en", "zh"). Falls back to LANG env var if not set. */
locale: z.string().optional(),
})
export type I18nConfig = z.infer<typeof I18nConfigSchema>
@@ -12,6 +12,7 @@ import { CommentCheckerConfigSchema } from "./comment-checker"
import { BuiltinCommandNameSchema } from "./commands"
import { ExperimentalConfigSchema } from "./experimental"
import { GitMasterConfigSchema } from "./git-master"
import { I18nConfigSchema } from "./i18n"
import { KeywordDetectorConfigSchema } from "./keyword-detector"
import { NotificationConfigSchema } from "./notification"
import { OpenClawConfigSchema } from "./openclaw"
@@ -67,6 +68,8 @@ export const OhMyOpenCodeConfigSchema = z.object({
notification: NotificationConfigSchema.optional(),
model_capabilities: ModelCapabilitiesConfigSchema.optional(),
openclaw: OpenClawConfigSchema.optional(),
/** Plugin i18n settings */
i18n: I18nConfigSchema.optional(),
team_mode: TeamModeConfigSchema.optional(),
/** Per-keyword disable list for the keyword-detector transform hook. Allowed values: "ultrawork", "search", "analyze", "team". */
keyword_detector: KeywordDetectorConfigSchema.optional(),