【懒人模式系列一】多语言适配,一次使用终身受益

目的就是给懒人用的,实现一次适配,全自动自动翻译,不用手动维护
先说流程:
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}`);

        }

爽的不要不要的

总结看起来有点复杂,其实实实际开发很简单,关键一次适配,全局通用,以下是效果图
1
2

1赞

把语言文件改成json会不会好些,直接下载解析,不用在脚本里引用。

1赞