修复bug
This commit is contained in:
@@ -7,10 +7,49 @@ import enUS from './locale/en-US.js'
|
||||
import idID from './locale/id-ID.js'
|
||||
import uView from '@climblee/uv-ui'
|
||||
import { initConsoleControl } from './config/console.js'
|
||||
import { getSystemConfig } from './config/api/system.js'
|
||||
|
||||
// #ifdef H5
|
||||
// 兼容部分依赖/构建产物在浏览器环境访问 process.env 的场景
|
||||
if (typeof globalThis !== 'undefined' && typeof globalThis.process === 'undefined') {
|
||||
globalThis.process = { env: {} }
|
||||
}
|
||||
if (typeof globalThis !== 'undefined' && globalThis.process && !globalThis.process.env) {
|
||||
globalThis.process.env = {}
|
||||
}
|
||||
// #endif
|
||||
|
||||
// 初始化 console 控制
|
||||
initConsoleControl()
|
||||
|
||||
const LANGUAGE_STORAGE_KEY = 'language'
|
||||
const SUPPORTED_LANGUAGES = ['zh-CN', 'en-US', 'id-ID']
|
||||
|
||||
const LANGUAGE_ALIASES = {
|
||||
zh: 'zh-CN',
|
||||
'zh-cn': 'zh-CN',
|
||||
'zh_cn': 'zh-CN',
|
||||
en: 'en-US',
|
||||
'en-us': 'en-US',
|
||||
'en_us': 'en-US',
|
||||
id: 'id-ID',
|
||||
'id-id': 'id-ID',
|
||||
'id_id': 'id-ID',
|
||||
in: 'id-ID',
|
||||
'in-id': 'id-ID',
|
||||
'in_id': 'id-ID'
|
||||
}
|
||||
|
||||
const normalizeLanguage = (lang) => {
|
||||
if (!lang || typeof lang !== 'string') return ''
|
||||
const cleaned = lang.trim()
|
||||
if (!cleaned) return ''
|
||||
const lower = cleaned.toLowerCase()
|
||||
if (LANGUAGE_ALIASES[lower]) return LANGUAGE_ALIASES[lower]
|
||||
if (SUPPORTED_LANGUAGES.includes(cleaned)) return cleaned
|
||||
return ''
|
||||
}
|
||||
|
||||
// 检测是否为 H5 环境
|
||||
const isH5Platform = () => {
|
||||
try {
|
||||
@@ -25,42 +64,69 @@ const isH5Platform = () => {
|
||||
|
||||
// 获取系统语言
|
||||
const getSystemLanguage = () => {
|
||||
// H5 环境默认使用印尼语
|
||||
if (isH5Platform()) {
|
||||
return 'id-ID'
|
||||
}
|
||||
|
||||
// 非 H5 环境根据系统语言判断
|
||||
let language = 'en-US'
|
||||
let language = 'zh-CN'
|
||||
try {
|
||||
const systemInfo = uni.getSystemInfoSync()
|
||||
if (systemInfo && systemInfo.language) {
|
||||
language = systemInfo.language === 'zh' || systemInfo.language.indexOf('zh') === 0
|
||||
? 'zh-CN'
|
||||
: 'en-US'
|
||||
const systemInfo = uni.getSystemInfoSync() || {}
|
||||
const systemLanguage = normalizeLanguage(systemInfo.language)
|
||||
if (systemLanguage) {
|
||||
language = systemLanguage
|
||||
} else if (isH5Platform() && typeof navigator !== 'undefined') {
|
||||
const browserLanguage = normalizeLanguage(navigator.language || '')
|
||||
if (browserLanguage) language = browserLanguage
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('获取系统语言失败:', e)
|
||||
// 默认使用中文
|
||||
language = 'zh-CN'
|
||||
}
|
||||
return language
|
||||
}
|
||||
|
||||
const extractLanguageFromConfig = (data) => {
|
||||
if (!data) return ''
|
||||
|
||||
if (typeof data === 'string') {
|
||||
return normalizeLanguage(data)
|
||||
}
|
||||
|
||||
if (Array.isArray(data)) {
|
||||
for (const item of data) {
|
||||
const fromItem = extractLanguageFromConfig(item)
|
||||
if (fromItem) return fromItem
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
if (typeof data === 'object') {
|
||||
const direct = normalizeLanguage(
|
||||
data.language || data.lang || data.locale || data.defaultLanguage || data.defaultLang
|
||||
)
|
||||
if (direct) return direct
|
||||
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
const keyLower = String(key).toLowerCase()
|
||||
if (keyLower.includes('lang') || keyLower.includes('locale')) {
|
||||
const parsed = extractLanguageFromConfig(value)
|
||||
if (parsed) return parsed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ''
|
||||
}
|
||||
|
||||
// 获取用户选择的语言
|
||||
const getSavedLanguage = () => {
|
||||
try {
|
||||
const savedLang = uni.getStorageSync('language')
|
||||
const savedLang = normalizeLanguage(uni.getStorageSync(LANGUAGE_STORAGE_KEY))
|
||||
if (savedLang) {
|
||||
return savedLang
|
||||
}
|
||||
const systemLang = getSystemLanguage()
|
||||
uni.setStorageSync('language', systemLang)
|
||||
uni.setStorageSync(LANGUAGE_STORAGE_KEY, systemLang)
|
||||
return systemLang
|
||||
} catch (e) {
|
||||
console.error('语言设置出错:', e)
|
||||
// 出错时根据平台返回默认语言
|
||||
return isH5Platform() ? 'id-ID' : 'zh-CN'
|
||||
return 'zh-CN'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,6 +170,27 @@ function getI18nInstance() {
|
||||
return i18nInstance
|
||||
}
|
||||
|
||||
const syncLanguageFromRemoteConfig = async (i18n) => {
|
||||
if (!isH5Platform()) return
|
||||
|
||||
try {
|
||||
const res = await getSystemConfig()
|
||||
if (!res || res.code !== 200) return
|
||||
|
||||
const remoteLang = extractLanguageFromConfig(res.data)
|
||||
if (!remoteLang) return
|
||||
|
||||
const current = normalizeLanguage(i18n?.global?.locale || '')
|
||||
if (current !== remoteLang) {
|
||||
uni.setStorageSync(LANGUAGE_STORAGE_KEY, remoteLang)
|
||||
i18n.global.locale = remoteLang
|
||||
console.log('H5 语言已按系统配置更新为:', remoteLang)
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('读取系统配置语言失败,使用本地语言设置:', e)
|
||||
}
|
||||
}
|
||||
|
||||
export function createApp() {
|
||||
|
||||
const app = createSSRApp(App)
|
||||
@@ -116,6 +203,9 @@ export function createApp() {
|
||||
|
||||
// 使用 i18n
|
||||
app.use(i18n)
|
||||
|
||||
// H5 端通过系统配置同步语言(异步,不阻塞应用启动)
|
||||
syncLanguageFromRemoteConfig(i18n)
|
||||
|
||||
// 手动注入 $i18n 到全局属性(确保组件可以访问)
|
||||
app.config.globalProperties.$i18n = i18n.global
|
||||
|
||||
Reference in New Issue
Block a user