160 lines
4.2 KiB
Plaintext
160 lines
4.2 KiB
Plaintext
// 通用 UTSJSONObject 转任意 type 的函数
|
||
// UTS 2024
|
||
|
||
import i18n from '../i18n/index.uts';
|
||
|
||
/**
|
||
* 切换应用语言设置
|
||
* @param locale 语言代码,如 'zh-CN' 或 'en-US'
|
||
*/
|
||
export function switchLocale(locale: string) {
|
||
// 设置存储
|
||
uni.setStorageSync('uVueI18nLocale', locale);
|
||
|
||
// 设置 i18n 语言
|
||
try {
|
||
i18n.global.locale.value = locale;
|
||
} catch (err) {
|
||
console.error('Failed to switch locale:', err);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取当前语言设置
|
||
* @returns 当前语言代码
|
||
*/
|
||
export function getCurrentLocale(): string {
|
||
const locale = uni.getStorageSync('uVueI18nLocale') as string;
|
||
if (locale == null || locale == '') {
|
||
return 'zh-CN';
|
||
}
|
||
return locale;
|
||
}
|
||
|
||
/**
|
||
* 确保语言设置正确初始化
|
||
*/
|
||
export function ensureLocaleInitialized() {
|
||
const currentLocale = getCurrentLocale();
|
||
if (currentLocale == null || currentLocale == '') {
|
||
switchLocale('zh-CN');
|
||
}
|
||
}
|
||
/**
|
||
* 将任意错误对象转换为标准的 UniError
|
||
* @param error 任意类型的错误对象
|
||
* @param defaultMessage 默认错误消息
|
||
* @returns 标准化的 UniError 对象
|
||
*/
|
||
export function toUniError(error: any, defaultMessage: string = '操作失败'): UniError {
|
||
// 如果已经是 UniError,直接返回
|
||
if (error instanceof UniError) {
|
||
return error
|
||
}
|
||
let errorMessage = defaultMessage
|
||
let errorCode = -1
|
||
|
||
try {
|
||
// 如果是普通 Error 对象
|
||
if (error instanceof Error) {
|
||
errorMessage = error.message != null && error.message != '' ? error.message : defaultMessage
|
||
}
|
||
// 如果是字符串
|
||
else if (typeof error === 'string') {
|
||
errorMessage = error
|
||
} // 如果是对象,尝试提取错误信息
|
||
else if (error != null && typeof error === 'object') {
|
||
const errorObj = error as UTSJSONObject
|
||
let message: string = ''
|
||
|
||
// 逐个检查字段,避免使用 || 操作符
|
||
if (errorObj['message'] != null) {
|
||
const msgValue = errorObj['message']
|
||
if (typeof msgValue === 'string') {
|
||
message = msgValue
|
||
}
|
||
} else if (errorObj['errMsg'] != null) {
|
||
const msgValue = errorObj['errMsg']
|
||
if (typeof msgValue === 'string') {
|
||
message = msgValue
|
||
}
|
||
} else if (errorObj['error'] != null) {
|
||
const msgValue = errorObj['error']
|
||
if (typeof msgValue === 'string') {
|
||
message = msgValue
|
||
}
|
||
} else if (errorObj['details'] != null) {
|
||
const msgValue = errorObj['details']
|
||
if (typeof msgValue === 'string') {
|
||
message = msgValue
|
||
}
|
||
} else if (errorObj['msg'] != null) {
|
||
const msgValue = errorObj['msg']
|
||
if (typeof msgValue === 'string') {
|
||
message = msgValue
|
||
}
|
||
}
|
||
|
||
if (message != '') {
|
||
errorMessage = message
|
||
}
|
||
|
||
// 尝试提取错误码
|
||
let code: number = 0
|
||
if (errorObj['code'] != null) {
|
||
const codeValue = errorObj['code']
|
||
if (typeof codeValue === 'number') {
|
||
code = codeValue
|
||
}
|
||
} else if (errorObj['errCode'] != null) {
|
||
const codeValue = errorObj['errCode']
|
||
if (typeof codeValue === 'number') {
|
||
code = codeValue
|
||
}
|
||
} else if (errorObj['status'] != null) {
|
||
const codeValue = errorObj['status']
|
||
if (typeof codeValue === 'number') {
|
||
code = codeValue
|
||
}
|
||
}
|
||
|
||
if (code != 0) {
|
||
errorCode = code
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.error('Error converting to UniError:', e)
|
||
errorMessage = defaultMessage
|
||
}
|
||
// 创建标准 UniError
|
||
const uniError = new UniError('AppError', errorCode, errorMessage)
|
||
return uniError
|
||
}
|
||
|
||
/**
|
||
* 响应式状态管理
|
||
* @returns 响应式状态对象
|
||
*/
|
||
export function responsiveState() {
|
||
const screenInfo = uni.getSystemInfoSync()
|
||
const screenWidth = screenInfo.screenWidth
|
||
|
||
return {
|
||
isLargeScreen: screenWidth >= 768,
|
||
isSmallScreen: screenWidth < 576,
|
||
screenWidth: screenWidth,
|
||
cardColumns: screenWidth >= 768 ? 3 : screenWidth >= 576 ? 2 : 1
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 兼容 UTS Android 的剪贴板写入
|
||
* @param text 要写入剪贴板的文本
|
||
*/
|
||
export function setClipboard(text: string): void {
|
||
// #ifdef WEB
|
||
uni.setClipboardData({ data: text });
|
||
// #endif
|
||
}
|
||
|