From 1e6cd55f0a43977939c592c0de4097ebac2d0693 Mon Sep 17 00:00:00 2001 From: jinhhanhan <1683105490@qq.com> Date: Thu, 15 Jan 2026 15:10:46 +0800 Subject: [PATCH] =?UTF-8?q?chore=EF=BC=9A=E4=B8=AD=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=8C=89=E9=92=AE=E8=83=BD=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E8=8B=B1=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/js/lang.js | 312 +++++++++++++---------------- components/hover-nav/hover-nav.vue | 19 +- 2 files changed, 141 insertions(+), 190 deletions(-) diff --git a/common/js/lang.js b/common/js/lang.js index c8ca741..613012d 100644 --- a/common/js/lang.js +++ b/common/js/lang.js @@ -1,205 +1,161 @@ import { langConfig } from './config-external.js'; - // 缓存已加载的语言包 const loadedLangPacks = {}; // 处理页面目录映射 function processRoutePath(route) { - let routeParts = route.split("/"); + 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("/"); + // ---- 处理页面目录映射 分包造成的,需要根据实际目录结构进行映射---- + 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 {}; - } + 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; + langList: langConfig.langList, + /** + * 解析多语言 + */ + lang(field) { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; - const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 + const locale = uni.getStorageSync('lang') || "zh-cn"; - let value = ''; // 存放解析后的语言值 - let langPath = ''; // 存放当前页面语言包路径 + let value = ''; + let langPath = ''; - try { - //公共语言包(同步加载) - var lang = loadLangPackSync(locale, 'common'); - - //当前页面语言包(同步加载) - let route = _this.route; - langPath = processRoutePath(route); - - // 加载当前页面语言包 - let currentPageLang = loadLangPackSync(locale, langPath); + try { + var lang = loadLangPackSync(locale, 'common'); + + let route = _this.route; + langPath = processRoutePath(route); + + let currentPageLang = loadLangPackSync(locale, langPath); - // 合并语言包 - let mergedLang = { ...lang, ...currentPageLang }; + 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, { langPath, field, locale }); - value = field; - } + 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 = ''; // 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}`); - } + if (field == value) { + console.warn(`警告: 字段 ${field} 在语言包 ${langPath} 中未找到对应值,使用默认值 ${field} 当前语言: ${locale}`); + } - 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; + 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"; //设置语言 + uni.setStorageSync("lang", value); + const locale = uni.getStorageSync('lang') || "zh-cn"; - // 清空已加载的语言包缓存 - for (let key in loadedLangPacks) { - if (!key.startsWith(locale)) { - delete loadedLangPacks[key]; - } - } + // ✅ 关键修复:清空所有语言包缓存(不再保留任何旧缓存) + for (let key in loadedLangPacks) { + delete loadedLangPacks[key]; + } - this.refresh(); + 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")); - - //设置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; - } -} + 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; + } +} \ No newline at end of file diff --git a/components/hover-nav/hover-nav.vue b/components/hover-nav/hover-nav.vue index 2a064fc..f2b1d7a 100644 --- a/components/hover-nav/hover-nav.vue +++ b/components/hover-nav/hover-nav.vue @@ -192,20 +192,15 @@ export default { this.currentLangIndex = this.currentLangIndex === 0 ? 1 : 0; const targetLang = this.langIndexMap[this.currentLangIndex]; - uni.setStorageSync('lang', targetLang); - - const pages = getCurrentPages(); - if (pages.length === 0) return; - - const currentPage = pages[pages.length - 1]; - const route = currentPage.route; - - console.log('【调试】切换语言:', targetLang, '路径:', route); + // 调用语言切换逻辑(设置 storage + 清空缓存) + this.$langConfig.change(targetLang); + // H5 环境需要强制刷新页面才能生效 if (uni.getSystemInfoSync().platform === 'browser') { - window.location.reload(); - } else { - uni.redirectTo({ url: `/${route}` }); + // 延迟 100ms 确保 change() 执行完成 + setTimeout(() => { + window.location.reload(); + }, 100); } }, openKefuSelectPopup() {