feat:添加中英文切换按钮

This commit is contained in:
Zhukj
2025-12-19 14:20:58 +08:00
parent 5b37e00b98
commit e77bdc0359
12 changed files with 402 additions and 267 deletions

View File

@@ -1,129 +1,136 @@
const langList = ['zh-cn', 'en-us'];
var locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
var locale = uni.getStorageSync('lang') || "zh-cn"; // 设置默认语言
export default {
langList: ['zh-cn', 'en-us'],
/**
* * 解析多语言
* @param {Object} field
* 解析多语言
* @param {String} field 语言包字段(如 'common.title'
* @returns {String} 对应语言的文字
*/
lang(field) {
let _this = getCurrentPages()[getCurrentPages().length - 1];
if (!_this) return;
if (!_this) return field; // 无页面时返回原字段避免undefined
var value = '';
var value = field; // 默认返回原字段,防止空白
let newRoute;
try {
//公共语言包
var lang = require('../../lang/' + locale + '/common.js').lang;
//当前页面语言包
// 1. 加载公共语言包(核心,兜底)
var commonLang = require('../../lang/' + locale + '/common.js').lang;
// 2. 加载当前页面语言包(可选,失败不影响)
let route = _this.route.split("/");
newRoute = route.slice(1, route.length);
let currentPageLang = require('../../lang/' + locale + '/' + newRoute.join("/") + '.js').lang;
for (let f in currentPageLang) {
lang[f] = currentPageLang[f];
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) {
for (let i in arr) {
var next = parseInt(i) + 1;
if (next < arr.length) {
value = lang[arr[i]][arr[next]];
}
value = lang; // 初始化为完整语言包
for (let i = 0; i < arr.length; i++) {
if (!value[arr[i]]) break; // 字段不存在时终止,避免报错
value = value[arr[i]];
}
} else {
value = lang[field];
value = lang[field] || field; // 字段不存在返回原字段
}
} catch (e) {
if (field.indexOf("common.") != -1 || field.indexOf("tabBar.") != -1) {
value = lang[field];
} else {
value = field;
}
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]);
value = value.replace("{" + (i - 1) + "}", arguments[i] || "");
}
}
if (value == undefined || (value == 'title' && field == 'title')) value = ''; // field
return value;
// 最终兜底避免返回undefined/空字符串
return value || field;
},
//切换语言
// 切换语言(核心修复:防白屏+全局事件)
change(value) {
let _this = getCurrentPages()[getCurrentPages().length - 1];
if (!_this) return;
// 1. 校验语言值合法性
if (!langList.includes(value)) {
console.error("语言值不合法:", value);
return;
}
// 2. 保存语言到本地存储
uni.setStorageSync("lang", value);
locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
locale = value; // 更新全局locale立即生效
// 3. 刷新标题/tabBar保留原有逻辑
this.refresh();
uni.reLaunch({
url: '/pages/member/index'
});
// 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
// 刷新标题、tabbar(优化:容错+强制生效)
refresh() {
let _this = getCurrentPages()[getCurrentPages().length - 1];
if (!_this) return;
locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
this.title(this.lang("title"));
locale = uni.getStorageSync('lang') || "zh-cn"; // 重新读取,确保最新
//设置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")
// });
// 刷新导航栏标题(容错:标题字段不存在时不报错)
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) {
if (str && typeof str === 'string') {
uni.setNavigationBarTitle({
title: str,
success: function (res) {
},
fail: function (err) {
console.warn("导航栏标题设置失败:", err);
}
});
}
},
// 获取语言包列表
// 获取语言包列表(优化:容错)
list() {
var list = [];
try {
//公共语言包
for (var i = 0; i < langList.length; i++) {
let item = require('../../lang/' + langList[i] + '/common.js').lang;
let langPath = '../../lang/' + langList[i] + '/common.js';
let item = require(langPath).lang;
list.push({
name: item.common.name,
name: item.common.name || langList[i], // 兜底:显示语言值
value: langList[i]
});
}
} catch (e) {
// "没有找到语言包:", '../../lang/' + locale + '/common.js'
console.error("获取语言包列表失败:", e);
// 兜底:返回基础列表
list = langList.map(item => ({ name: item, value: item }));
}
return list;
}
}
}