import * as React from "react"; import {Logger, reduxTools, ILogger} from '@yoronsoft/js-utils'; import {getLocales} from "react-native-localize"; import storage from "../storage"; import emitter from "../emitter"; import {LanguageAllData, LanguageData, ILanguage, LanguageConfig} from "./languages"; import {getConfigName} from "../config"; class Language implements ILanguage { private logger: ILogger private readonly typeName: string private readonly valueName: string private readonly languagePageDataName: string private readonly languageLocalesName: string constructor() { this.logger = new Logger(Language.name); this.typeName = `${getConfigName}_type`; this.valueName = `${getConfigName}_value`; this.languagePageDataName = `${getConfigName}_languagePageData`; this.languageLocalesName = `${getConfigName}_languageLocales`; } init(all: object, defaultSelect: string) { reduxTools.create(this.typeName, defaultSelect); reduxTools.create(this.valueName, all[defaultSelect]); storage.get(this.typeName).then(res => { if (res) { this.logger.log(`当前缓存语言:${res}`) this.set(all, res); } else storage.set(this.typeName, defaultSelect) }) } get(page: string, name: string): string { return this.getPage(page)[name] ?? ''; } getAll(): LanguageAllData { return reduxTools.get(this.valueName) ?? {}; } getAppLocales(): string { const locales = getLocales(); return locales[0].languageCode } getConfig(name: string): string { return this.getPage('config')[name] ?? ''; } getLocalesList(): { name: string; value: string }[] { const data: any = reduxTools.get(this.valueName) ?? {}; return data.languages ?? []; } getThemeList(): { name: string; value: string }[] { const data: any = reduxTools.get(this.valueName) ?? {}; return data.themes ?? []; } getModal(name: string): string { return this.getPage('modal')[name] ?? ''; } getNav(name: string): string { return this.getPage('nav')[name] ?? ''; } getPage(page: string): LanguageData { return this.getAll()[page] ?? {}; } getPhoneLocales(): string { return reduxTools.get(this.typeName) ?? ''; } getPopup(name: string): string { return this.getPage('popup')[name] ?? ''; } set(all: object, select: string): void { reduxTools.update(this.typeName, select); reduxTools.update(this.valueName, all[select]); storage.set(this.typeName, select); emitter.set(this.languageLocalesName, true); emitter.set(this.languagePageDataName, true); } useLanguage(pageName: string) { const [data, setData] = React.useState(language.getPage(pageName)); React.useEffect(() => { const emitterData = emitter.get(this.languagePageDataName, () => setData(language.getPage(pageName))) return () => emitterData.remove(); }, []); return data; } usePhoneLocales() { const [data, setData] = React.useState(language.getPhoneLocales()); React.useEffect(() => { const emitterData = emitter.get(this.languageLocalesName, () => setData(language.getPhoneLocales())) return () => emitterData.remove(); }, []); return data; } getTouchID(name: string): string { return this.getPage('touchID')[name] ?? ''; } } const language = new Language(); export default language; export type { LanguageAllData, LanguageData, ILanguage, LanguageConfig }