const langList = ['zh-cn', 'en-us']; var locale = uni.getStorageSync('lang') || "zh-cn"; // 设置默认语言 export default { langList: ['zh-cn', 'en-us'], /** * 解析多语言 * @param {String} field 语言包字段(如 'common.title') * @returns {String} 对应语言的文字 */ lang(field) { let _this = getCurrentPages()[getCurrentPages().length - 1]; if (!_this) return field; // 无页面时返回原字段,避免undefined var value = field; // 默认返回原字段,防止空白 let newRoute; try { // 1. 加载公共语言包(核心,兜底) var commonLang = require('../../lang/' + locale + '/common.js').lang; // 2. 加载当前页面语言包(可选,失败不影响) let route = _this.route.split("/"); newRoute = route.slice(1, route.length); let currentPageLang = {}; // 容错:页面语言包不存在时不报错 try { currentPageLang = require('../../lang/' + locale + '/' + newRoute.join("/") + '.js').lang; } catch (e) { console.warn(`当前页面(${newRoute.join("/")})无${locale}语言包`); } // 合并:页面语言包覆盖公共语言包 var lang = { ...commonLang, ...currentPageLang }; // 解析字段(支持多级,如 'common.langSwitchBtn') var arr = field.split("."); if (arr.length > 1) { value = lang; // 初始化为完整语言包 for (let i = 0; i < arr.length; i++) { if (!value[arr[i]]) break; // 字段不存在时终止,避免报错 value = value[arr[i]]; } } else { value = lang[field] || field; // 字段不存在返回原字段 } } catch (e) { console.error("语言包解析失败:", e); value = field; // 兜底:返回原字段,避免空白 } // 替换参数(如 'hello {0}' → 'hello 世界') if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { value = value.replace("{" + (i - 1) + "}", arguments[i] || ""); } } // 最终兜底:避免返回undefined/空字符串 return value || field; }, // 切换语言(核心修复:防白屏+全局事件) change(value) { // 1. 校验语言值合法性 if (!langList.includes(value)) { console.error("语言值不合法:", value); return; } // 2. 保存语言到本地存储 uni.setStorageSync("lang", value); locale = value; // 更新全局locale,立即生效 // 3. 刷新标题/tabBar(保留原有逻辑) this.refresh(); // 4. 触发全局语言切换事件(通知所有页面/组件更新) uni.$emit('lang-changed', value); // 5. 修复白屏:延迟重启当前页面(而非固定会员页) setTimeout(() => { let currentPage = getCurrentPages()[getCurrentPages().length - 1]; if (currentPage) { uni.reLaunch({ url: '/' + currentPage.route // 重启当前页面,而非固定会员页 }); } else { uni.reLaunch({ url: '/pages/index/index' }); // 兜底:重启首页 } }, 300); // 300ms延迟:确保语言配置加载完成,避免白屏 }, // 刷新标题、tabbar(优化:容错+强制生效) refresh() { let _this = getCurrentPages()[getCurrentPages().length - 1]; if (!_this) return; locale = uni.getStorageSync('lang') || "zh-cn"; // 重新读取,确保最新 // 刷新导航栏标题(容错:标题字段不存在时不报错) let titleText = this.lang("title") || ""; this.title(titleText); // 修复:启用tabBar文字更新(原代码被注释,导致tabBar语言不切换) try { 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") || "我的" }); } catch (e) { console.warn("tabBar文字更新失败:", e); } }, // 设置导航栏标题(优化:容错) title(str) { if (str && typeof str === 'string') { uni.setNavigationBarTitle({ title: str, fail: function (err) { console.warn("导航栏标题设置失败:", err); } }); } }, // 获取语言包列表(优化:容错) list() { var list = []; try { for (var i = 0; i < langList.length; i++) { let langPath = '../../lang/' + langList[i] + '/common.js'; let item = require(langPath).lang; list.push({ name: item.common.name || langList[i], // 兜底:显示语言值 value: langList[i] }); } } catch (e) { console.error("获取语言包列表失败:", e); // 兜底:返回基础列表 list = langList.map(item => ({ name: item, value: item })); } return list; } }