Files
pixelheros/assets/script/game/common/LangUtil.ts
panw a6915fdf00 refactor(LangUtil): 重构多语言工具类,新增枚举类型安全前缀
1. 将原有的字符串LangPrefix类型改为枚举类型,避免硬编码字符串错误
2. 更新所有使用处的调用方式,统一使用LangPrefix枚举来传入多语言前缀
3. 移除VictoryComp中硬编码的成就描述拼接逻辑,改用lang/langf方法获取多语言文本
4. 注释暂时不需要渲染的分数进度条代码
2026-05-15 15:44:43 +08:00

97 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @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;
}