refactor(LangUtil): 重构多语言工具类,新增枚举类型安全前缀
1. 将原有的字符串LangPrefix类型改为枚举类型,避免硬编码字符串错误 2. 更新所有使用处的调用方式,统一使用LangPrefix枚举来传入多语言前缀 3. 移除VictoryComp中硬编码的成就描述拼接逻辑,改用lang/langf方法获取多语言文本 4. 注释暂时不需要渲染的分数进度条代码
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -23,67 +23,68 @@
|
|||||||
* | hl_desc | 亮点成就描述 | hl_desc_9001 | 暴击{0}次 |
|
* | hl_desc | 亮点成就描述 | hl_desc_9001 | 暴击{0}次 |
|
||||||
*
|
*
|
||||||
* === 使用示例 ===
|
* === 使用示例 ===
|
||||||
* import { lang, langf } from "../common/LangUtil";
|
* import { LangPrefix, lang, langf } from "../common/LangUtil";
|
||||||
*
|
*
|
||||||
* // 英雄
|
* // 英雄
|
||||||
* lang("hero_name", 5001) // → "盾战士"
|
* lang(LangPrefix.hero_name, 5001) // → "盾战士"
|
||||||
* langf("skill_info", 6001, 1, 100) // → "对单个目标攻击1次,每次造成100%攻击的伤害"
|
* langf(LangPrefix.skill_info, 6001, 1, 100) // → "对单个目标攻击1次,每次造成100%攻击的伤害"
|
||||||
*
|
*
|
||||||
* // 驻场技能
|
* // 驻场技能
|
||||||
* lang("fskill_name", 7001) // → "召唤精通"
|
* lang(LangPrefix.fskill_name, 7001) // → "召唤精通"
|
||||||
* langf("fskill_info", 7001, 1) // → "场上所有友方召唤触发技能触发次数+1"
|
* langf(LangPrefix.fskill_info, 7001, 1) // → "场上所有友方召唤触发技能触发次数+1"
|
||||||
*
|
*
|
||||||
* // 亮点成就(与英雄/技能完全一致的调用方式)
|
* // 亮点成就(与英雄/技能完全一致的调用方式)
|
||||||
* lang("hl_name", 9001) // → "暴击大师"
|
* lang(LangPrefix.hl_title, 9011) // → "初级暴击者"
|
||||||
* langf("hl_desc", 9001, 20) // → "暴击20次"
|
* langf(LangPrefix.hl_desc, 9011, 20) // → "暴击20次"
|
||||||
*/
|
*/
|
||||||
import { oops } from "db://oops-framework/core/Oops";
|
import { oops } from "db://oops-framework/core/Oops";
|
||||||
|
|
||||||
export type LangPrefix =
|
export enum LangPrefix {
|
||||||
| "hero_name"
|
hero_name = "hero_name",
|
||||||
| "hero_info"
|
hero_info = "hero_info",
|
||||||
| "mon_name"
|
mon_name = "mon_name",
|
||||||
| "skill_name"
|
skill_name = "skill_name",
|
||||||
| "skill_info"
|
skill_info = "skill_info",
|
||||||
| "fskill_name"
|
fskill_name = "fskill_name",
|
||||||
| "fskill_info"
|
fskill_info = "fskill_info",
|
||||||
| "scard_name"
|
scard_name = "scard_name",
|
||||||
| "scard_info"
|
scard_info = "scard_info",
|
||||||
| "hl_name"
|
hl_title = "hl_title",
|
||||||
| "hl_desc";
|
hl_desc = "hl_desc",
|
||||||
|
}
|
||||||
|
|
||||||
function buildKey(prefix: LangPrefix, uuid: number | string): string {
|
function buildKey(prefix: string, uuid: number | string): string {
|
||||||
return `${prefix}_${uuid}`;
|
return `${prefix}_${uuid}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按前缀+uuid获取多语言文本
|
* 按前缀+uuid获取多语言文本
|
||||||
* @param prefix 类型前缀,如 "hero_name"、"skill_info"、"hl_name"
|
* @param prefix 类型前缀,推荐使用 LangPrefix 枚举
|
||||||
* @param uuid 唯一标识
|
* @param uuid 唯一标识
|
||||||
* @returns 翻译后的文本,找不到则返回 key 本身
|
* @returns 翻译后的文本,找不到则返回 key 本身
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* lang("hero_name", 5001) // → "盾战士"
|
* lang(LangPrefix.hero_name, 5001) // → "盾战士"
|
||||||
* lang("skill_name", 6002) // → "火球术"
|
* lang(LangPrefix.skill_name, 6002) // → "火球术"
|
||||||
* lang("hl_title", 9011) // → "初级暴击者"
|
* lang(LangPrefix.hl_title, 9011) // → "初级暴击者"
|
||||||
*/
|
*/
|
||||||
export function lang(prefix: LangPrefix, uuid: number | string): string {
|
export function lang(prefix: string, uuid: number | string): string {
|
||||||
const key = buildKey(prefix, uuid);
|
const key = buildKey(prefix, uuid);
|
||||||
return oops.language.getLangByID(key) || key;
|
return oops.language.getLangByID(key) || key;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按前缀+uuid获取多语言文本,并替换 {0} {1} ... 占位符
|
* 按前缀+uuid获取多语言文本,并替换 {0} {1} ... 占位符
|
||||||
* @param prefix 类型前缀
|
* @param prefix 类型前缀,推荐使用 LangPrefix 枚举
|
||||||
* @param uuid 唯一标识
|
* @param uuid 唯一标识
|
||||||
* @param params 模板参数,按顺序替换 {0} {1} ...
|
* @param params 模板参数,按顺序替换 {0} {1} ...
|
||||||
* @returns 翻译并替换参数后的文本
|
* @returns 翻译并替换参数后的文本
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* langf("skill_info", 6001, 1, 100) // → "对单个目标攻击1次,每次造成100%攻击的伤害"
|
* langf(LangPrefix.skill_info, 6001, 1, 100) // → "对单个目标攻击1次,每次造成100%攻击的伤害"
|
||||||
* langf("hl_desc", 9001, 20) // → "暴击20次"
|
* langf(LangPrefix.hl_desc, 9011, 20) // → "暴击20次"
|
||||||
*/
|
*/
|
||||||
export function langf(prefix: LangPrefix, uuid: number | string, ...params: any[]): string {
|
export function langf(prefix: string, uuid: number | string, ...params: any[]): string {
|
||||||
const key = buildKey(prefix, uuid);
|
const key = buildKey(prefix, uuid);
|
||||||
let str = oops.language.getLangByID(key) || key;
|
let str = oops.language.getLangByID(key) || key;
|
||||||
if (params && params.length > 0) {
|
if (params && params.length > 0) {
|
||||||
|
|||||||
9
assets/script/game/common/LangUtil.ts.meta
Normal file
9
assets/script/game/common/LangUtil.ts.meta
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "0790610b-af83-4922-ae8c-3b1ced9ff472",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
@@ -17,9 +17,9 @@
|
|||||||
* 9091~9095 = ThriftyPlayer 节俭玩家
|
* 9091~9095 = ThriftyPlayer 节俭玩家
|
||||||
*
|
*
|
||||||
* 多语言调用方式(与英雄/技能统一):
|
* 多语言调用方式(与英雄/技能统一):
|
||||||
* import { lang, langf } from "../common/LangUtil";
|
* import { LangPrefix, lang, langf } from "../common/LangUtil";
|
||||||
* lang("hl_title", 9011) // → "初级暴击者"
|
* lang(LangPrefix.hl_title, 9011) // → "初级暴击者"
|
||||||
* langf("hl_desc", 9011, 20) // → "暴击20次"
|
* langf(LangPrefix.hl_desc, 9011, 20) // → "暴击20次"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export enum HighlightType {
|
export enum HighlightType {
|
||||||
|
|||||||
@@ -2,21 +2,7 @@
|
|||||||
* @file VictoryComp.ts
|
* @file VictoryComp.ts
|
||||||
* @description 战斗结算弹窗组件(UI 视图层)
|
* @description 战斗结算弹窗组件(UI 视图层)
|
||||||
*
|
*
|
||||||
* 职责:
|
|
||||||
* 1. 在战斗结束时弹出,展示结算信息(得分、奖励)。
|
|
||||||
* 2. 根据传入参数判断是否可复活,切换"下一步"或"复活"按钮。
|
|
||||||
* 3. 计算单局总分并存储到 smc.vmdata.scores.score。
|
|
||||||
* 4. 提供"重新开始"和"退出"两个操作入口。
|
|
||||||
*
|
|
||||||
* 关键设计:
|
|
||||||
* - onAdded(args) 接收战斗结果参数(victory / rewards / game_data / can_revive)。
|
|
||||||
* - calculateTotalScore() 根据 ScoreWeights 配置加权计算各项得分。
|
|
||||||
* - restart() 和 victory_end() 通过分发 MissionEnd / MissionStart 事件驱动游戏状态切换。
|
|
||||||
*
|
|
||||||
* 依赖:
|
|
||||||
* - smc.vmdata.scores —— 全局战斗统计数据
|
|
||||||
* - ScoreWeights(ScoreSet)—— 得分权重配置
|
|
||||||
* - GameEvent.MissionEnd / MissionStart —— 游戏生命周期事件
|
|
||||||
*/
|
*/
|
||||||
import { _decorator, instantiate, Label ,Prefab,Node, Sprite, Animation, AnimationClip, resources, UITransform, Widget, ProgressBar } from "cc";
|
import { _decorator, instantiate, Label ,Prefab,Node, Sprite, Animation, AnimationClip, resources, UITransform, Widget, ProgressBar } from "cc";
|
||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
@@ -24,15 +10,12 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu
|
|||||||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
import { GameEvent } from "../common/config/GameEvent";
|
import { GameEvent } from "../common/config/GameEvent";
|
||||||
import { it } from "node:test";
|
|
||||||
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
||||||
import { HeroViewComp } from "../hero/HeroViewComp";
|
|
||||||
import { FacSet } from "../common/config/GameSet";
|
import { FacSet } from "../common/config/GameSet";
|
||||||
import { Attrs } from "../common/config/HeroAttrs";
|
|
||||||
import { HeroInfo } from "../common/config/heroSet";
|
import { HeroInfo } from "../common/config/heroSet";
|
||||||
import { CKind } from "../common/config/CardSet";
|
import { CKind } from "../common/config/CardSet";
|
||||||
import { ScoreWeights } from "../common/config/ScoreSet";
|
|
||||||
import { HighlightSet, HighlightType, HighlightLevel } from "../common/config/HighlightSet";
|
import { HighlightSet, HighlightType, HighlightLevel } from "../common/config/HighlightSet";
|
||||||
|
import { LangPrefix, lang, langf } from "../common/LangUtil";
|
||||||
import { mLogger } from "../common/Logger";
|
import { mLogger } from "../common/Logger";
|
||||||
import { UIID } from "../common/config/GameUIConfig";
|
import { UIID } from "../common/config/GameUIConfig";
|
||||||
|
|
||||||
@@ -505,11 +488,11 @@ export class VictoryComp extends CCComp {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// TODO: 进度条的最大值可按设计期望自行调整,目前为占位预估值
|
// TODO: 进度条的最大值可按设计期望自行调整,目前为占位预估值
|
||||||
renderDim(this.combat_node, s.score_combat, 3000);
|
// renderDim(this.combat_node, s.score_combat, 3000);
|
||||||
renderDim(this.output_node, s.score_output, 3000);
|
// renderDim(this.output_node, s.score_output, 3000);
|
||||||
renderDim(this.defense_node, s.score_defense, 1500);
|
// renderDim(this.defense_node, s.score_defense, 1500);
|
||||||
renderDim(this.build_node, s.score_build, 1000);
|
// renderDim(this.build_node, s.score_build, 1000);
|
||||||
renderDim(this.efficiency_node, s.score_efficiency, 200);
|
// renderDim(this.efficiency_node, s.score_efficiency, 200);
|
||||||
|
|
||||||
// 渲染成就亮点标签
|
// 渲染成就亮点标签
|
||||||
this.renderHighlights();
|
this.renderHighlights();
|
||||||
@@ -536,15 +519,14 @@ export class VictoryComp extends CCComp {
|
|||||||
const lab = tagNode.getComponent(Label) || tagNode.getChildByName("label")?.getComponent(Label);
|
const lab = tagNode.getComponent(Label) || tagNode.getChildByName("label")?.getComponent(Label);
|
||||||
|
|
||||||
if (lab) {
|
if (lab) {
|
||||||
// 获取主配置和等级配置
|
|
||||||
const typeConfig = HighlightSet[item.type];
|
const typeConfig = HighlightSet[item.type];
|
||||||
const levelConfig = item.config;
|
const levelConfig = item.config;
|
||||||
|
const uuid = levelConfig.uuid;
|
||||||
// 格式化描述(替换占位符 {0} 为实际所需达成的阈值或当前值)
|
|
||||||
let descStr = levelConfig.desc.replace("{0}", levelConfig.threshold.toString());
|
const titleStr = lang(LangPrefix.hl_title, uuid);
|
||||||
|
const descStr = langf(LangPrefix.hl_desc, uuid, levelConfig.threshold);
|
||||||
// 显示:[图标] 称号 (描述)
|
|
||||||
lab.string = `${typeConfig.icon} ${levelConfig.title} (${descStr})`;
|
lab.string = `${typeConfig.icon} ${titleStr} (${descStr})`;
|
||||||
}
|
}
|
||||||
this.highlights_container.addChild(tagNode);
|
this.highlights_container.addChild(tagNode);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user