import { langConfig } from './config-external.js'; // 缓存已加载的语言包 const loadedLangPacks = {}; // 处理页面目录映射 function processRoutePath(route) { let routeParts = route.split("/"); // ---- 处理页面目录映射 分包造成的,需要根据实际目录结构进行映射---- 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)]; } } // ---- 处理页面目录映射 ---- 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; } }