import { langConfig } from './config-external.js'; var locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 // 缓存已加载的语言包 var loadedLangPacks = {}; // 处理页面目录映射 function processRoutePath(route) { let routeParts = route.split("/"); // ---- 处理页面目录映射 分包造成的,需要根据实际目录结构进行映射---- // 先处理特殊的分包路径 if (routeParts[0] === 'pages_tool') { // pages_tool 分包下的页面,直接使用子目录作为语言包路径 routeParts = [routeParts[1], ...routeParts.slice(2)]; } else if (routeParts[0] === 'pages_goods') { // pages_goods 分包映射到 goods 目录 routeParts[0] = 'goods'; } else if (routeParts[0] === 'pages_member') { // pages_member 分包映射到 member 目录 routeParts[0] = 'member'; } else if (routeParts[0] === 'pages_order') { // pages_order 分包映射到 order 目录 routeParts[0] = 'order'; } else if (routeParts[0] === 'pages_promotion') { // pages_promotion 分包特殊处理 const promotionModules = ['point', 'fenxiao', 'merch']; if (routeParts[1] && promotionModules.includes(routeParts[1])) { routeParts = [routeParts[1], ...routeParts.slice(2)]; } } // ---- 处理页面目录映射 ---- // 去掉pages目录,只保留子目录 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, /** * * 解析多语言 * @param {Object} field */ lang(field) { let _this = getCurrentPages()[getCurrentPages().length - 1]; if (!_this) return; var value = ''; try { //公共语言包(同步加载) var lang = loadLangPackSync(locale, 'common'); //当前页面语言包(同步加载) let route = _this.route; let langPath = processRoutePath(route); // console.log(`当前页面语言包路径: ${langPath}`); // 加载当前页面语言包 let currentPageLang = loadLangPackSync(locale, langPath); // 合并语言包 let mergedLang = { ...lang, ...currentPageLang }; // 解析字段 var arr = field.split("."); if (arr.length > 1) { // 处理嵌套属性,如 common.currencySymbol 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); 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 = ''; // field // 多语言调试,注释后可以关闭控制台输出 // console.log(`字段: ${field}, 值: ${value}`) return value; }, /** * * 切换语言 * @param {String} value 语言值 * @param {String} url 切换后跳转的页面url */ change(value, url = '/pages_tool/member/index') { let _this = getCurrentPages()[getCurrentPages().length - 1]; if (!_this) return; uni.setStorageSync("lang", value); locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 // 清空已加载的语言包缓存 loadedLangPacks = {}; this.refresh(); if (url) { uni.reLaunch({ url: url }); } }, //刷新标题、tabbar refresh() { let _this = getCurrentPages()[getCurrentPages().length - 1]; if (!_this) return; locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 this.title(this.lang("title")); //设置tabbar的文字语言 // uni.setTabBarItem({ // index: 0, // text: this.lang("tabBar.home") // }); // uni.setTabBarItem({ // index: 1, // text: this.lang("tabBar.category") // }); // uni.setTabBarItem({ // index: 2, // text: this.lang("tabBar.cart") // }); // uni.setTabBarItem({ // index: 3, // text: this.lang("tabBar.member") // }); }, title(str) { if (str) { uni.setNavigationBarTitle({ title: str, success: function (res) { }, fail: function (err) { } }); } }, // 获取语言包列表 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; } }