/** * @file LangUtil.ts * @description 多语言工具 - 在显示阶段进行多语言转换,配置阶段采用硬编码 * * === 设计原则 === * 1. 配置文件(heroSet / SkillSet / HighlightSet 等)中直接使用硬编码中文字符串 * 2. 当需要显示多语言时,通过本工具的函数在运行时将 uuid 映射到对应语言文本 * 3. 多语言 key 采用 "类型前缀_uuid" 的命名规范,自动生成,无需手动维护映射表 * * === 多语言 key 命名规范 === * | 前缀 | 含义 | 示例 key | 对应 zh.json 中的值 | * |-------------|-------------------|---------------------|----------------------| * | hero_name | 英雄名称 | hero_name_5001 | 盾战士 | * | hero_info | 英雄描述 | hero_info_5001 | 近战,魔法盾 坦克 | * | mon_name | 怪物名称 | mon_name_6001 | 兽人战士 | * | skill_name | 技能名称 | skill_name_6001 | 攻击 | * | skill_info | 技能描述 | skill_info_6001 | 对单个目标攻击... | * | fskill_name | 驻场技能名称 | fskill_name_7001 | 召唤精通 | * | fskill_info | 驻场技能描述 | fskill_info_7001 | 召唤触发... | * | scard_name | 特殊卡牌名称 | scard_name_7001 | 战术晋升 | * | scard_info | 特殊卡牌描述 | scard_info_7001 | 升级场上随机... | * | hl_name | 亮点成就名称 | hl_name_9001 | 暴击大师 | * | hl_desc | 亮点成就描述 | hl_desc_9001 | 暴击{0}次 | * * === 使用示例 === * import { LangPrefix, lang, langf } from "../common/LangUtil"; * * // 英雄 * lang(LangPrefix.hero_name, 5001) // → "盾战士" * langf(LangPrefix.skill_info, 6001, 1, 100) // → "对单个目标攻击1次,每次造成100%攻击的伤害" * * // 驻场技能 * lang(LangPrefix.fskill_name, 7001) // → "召唤精通" * langf(LangPrefix.fskill_info, 7001, 1) // → "场上所有友方召唤触发技能触发次数+1" * * // 亮点成就(与英雄/技能完全一致的调用方式) * lang(LangPrefix.hl_title, 9011) // → "初级暴击者" * langf(LangPrefix.hl_desc, 9011, 20) // → "暴击20次" */ import { oops } from "db://oops-framework/core/Oops"; export enum LangPrefix { hero_name = "hero_name", hero_info = "hero_info", mon_name = "mon_name", skill_name = "skill_name", skill_info = "skill_info", fskill_name = "fskill_name", fskill_info = "fskill_info", scard_name = "scard_name", scard_info = "scard_info", hl_title = "hl_title", hl_desc = "hl_desc", } function buildKey(prefix: string, uuid: number | string): string { return `${prefix}_${uuid}`; } /** * 按前缀+uuid获取多语言文本 * @param prefix 类型前缀,推荐使用 LangPrefix 枚举 * @param uuid 唯一标识 * @returns 翻译后的文本,找不到则返回 key 本身 * * @example * lang(LangPrefix.hero_name, 5001) // → "盾战士" * lang(LangPrefix.skill_name, 6002) // → "火球术" * lang(LangPrefix.hl_title, 9011) // → "初级暴击者" */ export function lang(prefix: string, uuid: number | string): string { const key = buildKey(prefix, uuid); return oops.language.getLangByID(key) || key; } /** * 按前缀+uuid获取多语言文本,并替换 {0} {1} ... 占位符 * @param prefix 类型前缀,推荐使用 LangPrefix 枚举 * @param uuid 唯一标识 * @param params 模板参数,按顺序替换 {0} {1} ... * @returns 翻译并替换参数后的文本 * * @example * langf(LangPrefix.skill_info, 6001, 1, 100) // → "对单个目标攻击1次,每次造成100%攻击的伤害" * langf(LangPrefix.hl_desc, 9011, 20) // → "暴击20次" */ export function langf(prefix: string, uuid: number | string, ...params: any[]): string { const key = buildKey(prefix, uuid); let str = oops.language.getLangByID(key) || key; if (params && params.length > 0) { for (let i = 0; i < params.length; i++) { str = str.replace(`{${i}}`, String(params[i])); } } return str; }