You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
86 lines
2.6 KiB
import { nextTick } from 'vue'
|
|
import { getAppPages, getSubPackagesPages} from "@/utils/pages"
|
|
|
|
class Language {
|
|
private i18n: any
|
|
private loadLocale: Array<string> = [] //已加载的语言
|
|
|
|
public path = ''
|
|
|
|
constructor(i18n: any) {
|
|
this.i18n = i18n
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param locale 设置语言
|
|
*/
|
|
public setI18nLanguage(locale: string, path: string = '') {
|
|
if (this.i18n.global.locale == locale) return
|
|
this.i18n.global.locale = locale
|
|
path && (this.path = path)
|
|
uni.setLocale(locale)
|
|
}
|
|
|
|
public loadAllLocaleMessages(app: string, locale: string) {
|
|
const pages = app == 'app' ? getAppPages() : getSubPackagesPages()
|
|
pages.forEach((path: string) => {
|
|
this.loadLocaleMessages(path, locale)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 加载语言包
|
|
* @param path
|
|
* @param locale
|
|
* @returns
|
|
*/
|
|
public async loadLocaleMessages(path: string, locale: string) {
|
|
try {
|
|
const { route, file, fileKey } = this.getFileKey(path)
|
|
|
|
// 是否已加载
|
|
if (this.loadLocale.includes(`${fileKey}.${locale}`)) {
|
|
this.setI18nLanguage(locale, file)
|
|
return nextTick()
|
|
}
|
|
this.loadLocale.push(`${fileKey}.${locale}`)
|
|
|
|
// 引入语言包文件
|
|
const messages = await import(route == 'app' ? `../${route}/locale/${locale}/${file}.json` : `../addon/${route}/locale/${locale}/${file}.json`)
|
|
let data: Record<string, string> = {}
|
|
Object.keys(messages.default).forEach(key => {
|
|
data[`${fileKey}.${key}`] = messages.default[key]
|
|
})
|
|
|
|
this.i18n.global.mergeLocaleMessage(locale, data)
|
|
this.setI18nLanguage(locale, file)
|
|
|
|
return nextTick()
|
|
} catch (e) {
|
|
// console.log(e)
|
|
this.setI18nLanguage(locale)
|
|
return nextTick()
|
|
}
|
|
}
|
|
|
|
public getFileKey = (path: string) => {
|
|
const pathArr = path.split('/')
|
|
let route = pathArr[1] == 'app' ? pathArr[1] : pathArr[2];
|
|
|
|
let file = path == '/' ? 'pages.index.index' : path.replace('/', '').replaceAll('/', '.')
|
|
|
|
// 如果是系统页面,则移除“app.”
|
|
let fileKey = ''
|
|
if (route == 'app') {
|
|
fileKey = file.replace('app.', '')
|
|
file = file.replace('app.', '')
|
|
} else {
|
|
fileKey = file.replace(`addon.`, '')
|
|
file = file.replace(`addon.${route}.`, '')
|
|
}
|
|
return { file, fileKey, route }
|
|
}
|
|
}
|
|
|
|
export default Language
|
|
|