161 lines
4.9 KiB
JavaScript
161 lines
4.9 KiB
JavaScript
import { langConfig } from './config-external.js';
|
|
|
|
// 缓存已加载的语言包
|
|
const loadedLangPacks = {};
|
|
|
|
// 处理页面目录映射
|
|
function processRoutePath(route) {
|
|
let routeParts = route.split("/");
|
|
|
|
// ---- 处理页面目录映射 <begin> 分包造成的,需要根据实际目录结构进行映射----
|
|
if (routeParts[0] === 'pages_tool') {
|
|
routeParts = [routeParts[1], ...routeParts.slice(2)];
|
|
} else if (routeParts[0] === 'pages_goods') {
|
|
routeParts[0] = 'goods';
|
|
} else if (routeParts[0] === 'pages_member') {
|
|
routeParts[0] = 'member';
|
|
} else if (routeParts[0] === 'pages_order') {
|
|
routeParts[0] = 'order';
|
|
} else if (routeParts[0] === 'pages_promotion') {
|
|
const promotionModules = ['point', 'fenxiao', 'merch'];
|
|
if (routeParts[1] && promotionModules.includes(routeParts[1])) {
|
|
routeParts = [routeParts[1], ...routeParts.slice(2)];
|
|
}
|
|
}
|
|
// ---- 处理页面目录映射 <end>----
|
|
|
|
if (routeParts[0] === 'pages') {
|
|
routeParts = routeParts.slice(1);
|
|
}
|
|
|
|
return routeParts.join("/");
|
|
}
|
|
|
|
// 加载语言包(同步方式)
|
|
function loadLangPackSync(lang, path) {
|
|
try {
|
|
if (loadedLangPacks[`${lang}_${path}`]) {
|
|
return loadedLangPacks[`${lang}_${path}`];
|
|
}
|
|
const langData = require(`@/lang/${lang}/${path}.js`).lang;
|
|
loadedLangPacks[`${lang}_${path}`] = langData;
|
|
return langData;
|
|
} catch (error) {
|
|
console.error(`加载语言包 ${lang}/${path} 失败:`, error);
|
|
return {};
|
|
}
|
|
}
|
|
|
|
export default {
|
|
langList: langConfig.langList,
|
|
/**
|
|
* 解析多语言
|
|
*/
|
|
lang(field) {
|
|
let _this = getCurrentPages()[getCurrentPages().length - 1];
|
|
if (!_this) return;
|
|
|
|
const locale = uni.getStorageSync('lang') || "zh-cn";
|
|
|
|
let value = '';
|
|
let langPath = '';
|
|
|
|
try {
|
|
var lang = loadLangPackSync(locale, 'common');
|
|
|
|
let route = _this.route;
|
|
langPath = processRoutePath(route);
|
|
|
|
let currentPageLang = loadLangPackSync(locale, langPath);
|
|
|
|
let mergedLang = { ...lang, ...currentPageLang };
|
|
|
|
var arr = field.split(".");
|
|
if (arr.length > 1) {
|
|
let temp = mergedLang;
|
|
let found = true;
|
|
for (let key of arr) {
|
|
if (temp[key] !== undefined) {
|
|
temp = temp[key];
|
|
} else {
|
|
found = false;
|
|
break;
|
|
}
|
|
}
|
|
value = found ? temp : field;
|
|
} else {
|
|
value = mergedLang[field] !== undefined ? mergedLang[field] : field;
|
|
}
|
|
|
|
} catch (e) {
|
|
console.error('解析语言包失败:', e, { langPath, field, locale });
|
|
value = field;
|
|
}
|
|
|
|
if (arguments.length > 1) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
value = value.replace("{" + (i - 1) + "}", arguments[i]);
|
|
}
|
|
}
|
|
if (value == undefined || (value == 'title' && field == 'title')) value = '';
|
|
|
|
if (field == value) {
|
|
console.warn(`警告: 字段 ${field} 在语言包 ${langPath} 中未找到对应值,使用默认值 ${field} 当前语言: ${locale}`);
|
|
}
|
|
|
|
return value;
|
|
},
|
|
/**
|
|
* 切换语言
|
|
*/
|
|
change(value, url = '/pages_tool/member/index') {
|
|
let _this = getCurrentPages()[getCurrentPages().length - 1];
|
|
if (!_this) return;
|
|
|
|
uni.setStorageSync("lang", value);
|
|
const locale = uni.getStorageSync('lang') || "zh-cn";
|
|
|
|
// ✅ 关键修复:清空所有语言包缓存(不再保留任何旧缓存)
|
|
for (let key in loadedLangPacks) {
|
|
delete loadedLangPacks[key];
|
|
}
|
|
|
|
this.refresh();
|
|
|
|
if (url) {
|
|
uni.reLaunch({ url: url });
|
|
}
|
|
},
|
|
//刷新标题、tabbar
|
|
refresh() {
|
|
let _this = getCurrentPages()[getCurrentPages().length - 1];
|
|
if (!_this) return;
|
|
const locale = uni.getStorageSync('lang') || "zh-cn";
|
|
|
|
this.title(this.lang("title"));
|
|
},
|
|
title(str) {
|
|
if (str) {
|
|
uni.setNavigationBarTitle({
|
|
title: str
|
|
});
|
|
}
|
|
},
|
|
// 获取语言包列表
|
|
list() {
|
|
var list = [];
|
|
try {
|
|
for (var i = 0; i < langConfig.langList.length; i++) {
|
|
let langType = langConfig.langList[i];
|
|
let item = loadLangPackSync(langType, 'common');
|
|
list.push({
|
|
name: item.common ? item.common.name : langType,
|
|
value: langType
|
|
});
|
|
}
|
|
} catch (e) {
|
|
console.error('获取语言包列表失败:', e);
|
|
}
|
|
return list;
|
|
}
|
|
} |