目的就是给懒人用的,实现一次适配,全自动自动翻译,不用手动维护
先说流程:
1、多语言管理器代码:
import { logMgr } from “./LogMgr”;
/**
* 多语言管理器
* 提供多语言切换和翻译功能。
*/
class LangMgr {
private static _instance: LangMgr; // 单例实例
private _currentLanguage: string; // 当前语言
private _translations: Record<string, Record<string, string>>; // 翻译
// 私有构造函数,确保外部无法直接通过new创建实例
private constructor() {
this._currentLanguage = "zh"; // 默认语言为中文
this._translations = {};
}
// 获取单例实例
public static get instance(): LangMgr {
if (!this._instance) {
this._instance = new LangMgr();
}
return this._instance;
}
/**
* 设置当前语言
* @param language 语言标识
*/
public setLanguage(language: string): void {
this._currentLanguage = language;
logMgr.info(`切换语言为 ${language}`);
}
/**
* 获取翻译文本
* @param key 文本标识
* @returns 翻译文本
*/
public getTranslation(key: string): string {
const translation = this._translations[this._currentLanguage];
if (translation && translation[key]) {
return translation[key];
}
logMgr.warn(`找不到翻译文本:${key}`);
return key; // 如果找不到对应的翻译文本,则返回原始的key
}
/**
* 加载翻译文件
* @param translations 翻译文件
*/
public loadTranslations(translations: Record<string, Record<string, string>>): void {
this._translations = translations;
logMgr.info(`加载翻译文件成功`);
}
}
// 导出LangMgr的单例实例
export const langMgr = LangMgr.instance;
很常规的一个单例
2、新建一个Config.ts,内容:
export class Config { static lang: string = "en"; // 默认语言 }
3、随便写了2个翻译文件en.ts,zh.ts,内容如下:
/**
* 英文
*/
export const en = {
10000: “Guest”,
10001: “Phone”,
10002: “FastLogin”,
10003: “Login”,
};
/**
* 中文
*/
export const zh = {
10000: "游客",
10001: "手机",
10002: "免注册登录",
10003: "登录",
};
4、在需要翻译的地方:
import { langMgr } from “…/…/…/Mgr/LangMgr”;
import { Config} from ‘…/…/scripts/Config’;
import { zh } from ‘./lang/zh’;
import { en } from ‘./lang/en’;
然后根据配置设置默认语言
// 全局默认语言
langMgr.setLanguage(Config.lang);
最后
// 载入
onLoad() {
// 加载翻译文件
const translations = {
en: en,
zh: zh,
};
// 设置当前语言
langMgr.loadTranslations(translations);
}
补充:
需要根据节点名称来自动翻译,比如我把需要翻译的节点名称取名:#10000、#10001以此类推
然后使用代码:
// 如果节点名称以#开头,则使用节点的字符串作为需要翻译的文本
if (node.name.startsWith('#')) {
const translationKey = node.name.slice(1);
const translationText = langMgr.getTranslation(translationKey);
node.getComponent(Label).string = translationText;
logMgr.debug(`翻译节点 ${path} 的文本为 ${translationText}`);
}
爽的不要不要的
总结看起来有点复杂,其实实实际开发很简单,关键一次适配,全局通用,以下是效果图

