Files
lucky_shop/common/js/lang.js
2025-12-19 14:20:58 +08:00

136 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}