多语言模块
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
import { _decorator, sys } from "cc";
|
||||
import { Language } from "../../schema/schema";
|
||||
import ConfigManager from "../../chat18x/manager/ConfigManager";
|
||||
import { CommonConfig } from "../Config/CommonConfig";
|
||||
import li_EventManager from "./li_EventManager";
|
||||
import Utils from "./Utils";
|
||||
import { InnerMsgCode } from "../Config/InnerMsgCode";
|
||||
|
||||
const { ccclass } = _decorator;
|
||||
|
||||
export enum LanguageType {
|
||||
EN = "en", // 英文
|
||||
CN = "cn", // 中文
|
||||
HI = "hi", // 印地语
|
||||
FR = "fr", // 法语
|
||||
DE = "de", //德语
|
||||
}
|
||||
|
||||
export enum LanguageEvent {
|
||||
LANGUAGE_CHANGED = "LANGUAGE_CHANGED",
|
||||
}
|
||||
|
||||
@ccclass("LanguageUtils")
|
||||
export default class LanguageUtils {
|
||||
private static currentLanguage: LanguageType = LanguageType.EN;
|
||||
private static languageCache: Map<string, string> = new Map();
|
||||
private static isInitialized: boolean = false;
|
||||
|
||||
public static get CurrentLanguage(): LanguageType {
|
||||
if (!this.isInitialized) {
|
||||
this.init();
|
||||
}
|
||||
return this.currentLanguage;
|
||||
}
|
||||
|
||||
private static init() {
|
||||
if (this.isInitialized) return;
|
||||
this.isInitialized = true;
|
||||
this.loadLanguageSetting();
|
||||
}
|
||||
|
||||
private static loadLanguageSetting() {
|
||||
const savedLanguage = sys.localStorage.getItem(
|
||||
CommonConfig.StorageConfig.LANGUAGE_SETTING
|
||||
);
|
||||
if (
|
||||
savedLanguage &&
|
||||
Object.values(LanguageType).includes(savedLanguage as LanguageType)
|
||||
) {
|
||||
this.currentLanguage = savedLanguage as LanguageType;
|
||||
} else {
|
||||
this.detectSystemLanguage();
|
||||
}
|
||||
console.log(
|
||||
"LanguageUtils initialized with language:",
|
||||
this.currentLanguage
|
||||
);
|
||||
}
|
||||
|
||||
private static detectSystemLanguage() {
|
||||
const systemLanguage = sys.language;
|
||||
if (systemLanguage.startsWith("zh")) {
|
||||
this.currentLanguage = LanguageType.CN;
|
||||
} else if (systemLanguage.startsWith("hi")) {
|
||||
this.currentLanguage = LanguageType.HI;
|
||||
} else if (systemLanguage.startsWith("fr")) {
|
||||
this.currentLanguage = LanguageType.FR;
|
||||
} else if (systemLanguage.startsWith("de")) {
|
||||
this.currentLanguage = LanguageType.DE;
|
||||
} else {
|
||||
this.currentLanguage = LanguageType.EN;
|
||||
}
|
||||
}
|
||||
|
||||
public static setLanguage(language: LanguageType): void {
|
||||
if (!this.isInitialized) {
|
||||
this.init();
|
||||
}
|
||||
|
||||
if (this.currentLanguage === language) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.currentLanguage = language;
|
||||
this.languageCache.clear();
|
||||
sys.localStorage.setItem(
|
||||
CommonConfig.StorageConfig.LANGUAGE_SETTING,
|
||||
language
|
||||
);
|
||||
|
||||
Utils.sendInnerMsg(InnerMsgCode.LanguageChange, language);
|
||||
console.log("Language changed to:", language);
|
||||
}
|
||||
|
||||
public static getText(key: string, defaultText: string = ""): string {
|
||||
if (!this.isInitialized) {
|
||||
this.init();
|
||||
}
|
||||
|
||||
if (!key) {
|
||||
return defaultText;
|
||||
}
|
||||
|
||||
if (this.languageCache.has(key)) {
|
||||
return this.languageCache.get(key);
|
||||
}
|
||||
|
||||
if (!ConfigManager.tables || !ConfigManager.tables.TbLanguage) {
|
||||
console.warn("Language table not loaded yet");
|
||||
return defaultText || key;
|
||||
}
|
||||
|
||||
const languageData = ConfigManager.tables.TbLanguage.get(key);
|
||||
if (!languageData) {
|
||||
console.warn(`Language key not found: ${key}`);
|
||||
return defaultText || key;
|
||||
}
|
||||
|
||||
let text: string = "";
|
||||
switch (this.currentLanguage) {
|
||||
case LanguageType.EN:
|
||||
text = languageData.languageEn;
|
||||
break;
|
||||
case LanguageType.CN:
|
||||
text = languageData.languageCn;
|
||||
break;
|
||||
case LanguageType.HI:
|
||||
text = languageData.languageHi;
|
||||
break;
|
||||
case LanguageType.FR:
|
||||
text = languageData.languageFr;
|
||||
break;
|
||||
case LanguageType.DE:
|
||||
text = languageData.languageDe;
|
||||
break;
|
||||
default:
|
||||
text = languageData.languageEn;
|
||||
}
|
||||
|
||||
if (!text || text.length === 0) {
|
||||
text = languageData.languageEn || defaultText || key;
|
||||
}
|
||||
|
||||
this.languageCache.set(key, text);
|
||||
return text;
|
||||
}
|
||||
|
||||
public static getTextWithParams(
|
||||
key: string,
|
||||
params: { [key: string]: any },
|
||||
defaultText: string = ""
|
||||
): string {
|
||||
let text = this.getText(key, defaultText);
|
||||
|
||||
for (let paramKey in params) {
|
||||
const regex = new RegExp(`{${paramKey}}`, "g");
|
||||
text = text.replace(regex, params[paramKey].toString());
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
public static getAvailableLanguages(): LanguageType[] {
|
||||
return Object.values(LanguageType);
|
||||
}
|
||||
|
||||
public static getLanguageDisplayName(language: LanguageType): string {
|
||||
switch (language) {
|
||||
case LanguageType.EN:
|
||||
return "English";
|
||||
case LanguageType.CN:
|
||||
return "中文";
|
||||
case LanguageType.HI:
|
||||
return "हिंदी";
|
||||
case LanguageType.FR:
|
||||
return "Français";
|
||||
case LanguageType.DE:
|
||||
return "Deutsch";
|
||||
default:
|
||||
return language;
|
||||
}
|
||||
}
|
||||
|
||||
public static clearCache(): void {
|
||||
this.languageCache.clear();
|
||||
}
|
||||
|
||||
public static onLanguageChanged(
|
||||
callback: (language: LanguageType) => void,
|
||||
target: any
|
||||
): void {
|
||||
Utils.addInnerEL(InnerMsgCode.LanguageChange, target, callback);
|
||||
}
|
||||
|
||||
public static offLanguageChanged(
|
||||
callback: (language: LanguageType) => void,
|
||||
target: any
|
||||
): void {
|
||||
Utils.removeInnerEL(InnerMsgCode.LanguageChange, target, callback);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user