uni-app 国际化传参在App显示异常
uni-app 国际化传参在App显示异常
| 类别 | 信息 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| 版本号 | Windows 10 专业版 |
| HBuilderX | 正式 |
| 版本号 | 4.74 |
| 手机系统 | Android |
| 版本号 | Android 11 |
| 手机厂商 | 华为 |
| 手机机型 | 红米 k20 pro |
| 页面类型 | vue |
| vue版本 | vue3 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
示例代码:
const timeTaskTip = computed(() => {
if (dateNum.value === 0) {
const list = times.map(item => {
return item.slice(0, 3)
})
return t('task.sl', {
time: list[singleTaskIndex.value],
hour: singleTaskIndex.value === 0 ? 'hour' : 'hours'
})
} else if (dateNum.value === 1) {
const list = everydayTimes.map(item => {
return item.slice(0, 3)
})
return t('task.el', {
time: list[everydayTaskIndex.value],
hour: everydayTaskIndex.value === 0 ? 'hour' : 'hours'
})
} else {
return t('task.esl')
}
})
操作步骤:
import { createI18n } from 'vue-i18n'
import en from './en.json'
import zhHans from './zh-Hans.json'
const messages = {
en,
'zh-Hans': zhHans
}
const getLocale = () => {
const locale = uni.getLocale() // 获取系统语言环境
return locale.startsWith('zh') ? 'zh-Hans' : 'en'
}
const i18n = createI18n({
legacy: false, // 使用 Composition API 模式
globalInjection: true, // 全局注入 $t
locale: getLocale(),
messages
})
export default i18n
"task.sl": "清洁一次,时长为 {time} 小时。",
"task.el": "每24小时清洁一次,每次 {time} 小时。",
"task.esl": "每48小时清洁一次,每次40分钟。"
预期结果:
传参后参数覆盖key
实际结果:
传参后参数不覆盖key
bug描述:
在PC端国际化传参显示正常,App显示异常
图一PC端图二App,App的{time}参数无效


更多关于uni-app 国际化传参在App显示异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
暂不支持,可以参考官方文档的解决办法 https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html#vue-i18n
更多关于uni-app 国际化传参在App显示异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 uni-app App 端使用 vue-i18n 进行国际化传参时出现参数未替换的问题,通常与平台差异和初始化时机有关。
问题分析:
-
uni.getLocale() 在 App 端的异步特性:在 App 端,uni.getLocale() 可能需要等待原生环境准备就绪,而 PC 端可以立即获取。这可能导致 i18n 初始化时语言环境尚未正确获取。
-
vue-i18n 版本兼容性:确保使用的 vue-i18n 版本与 Vue 3 完全兼容。建议使用 vue-i18n@9.x 或更高版本。
解决方案:
- 延迟初始化 i18n:
let i18n = null
const initI18n = async () => {
const locale = await new Promise((resolve) => {
// 给 App 端更多时间获取语言环境
setTimeout(() => {
resolve(uni.getLocale())
}, 100)
})
i18n = createI18n({
legacy: false,
globalInjection: true,
locale: locale.startsWith('zh') ? 'zh-Hans' : 'en',
messages
})
return i18n
}
export default initI18n
- 在应用启动时初始化: 在 main.js 或 App.vue 中:
import initI18n from './i18n'
initI18n().then(i18n => {
app.use(i18n)
// 其他初始化代码
})
-
检查 JSON 文件编码:确保 en.json 和 zh-Hans.json 使用 UTF-8 编码,避免特殊字符解析问题。
-
使用 fallbackLocale:
const i18n = createI18n({
legacy: false,
globalInjection: true,
locale: getLocale(),
fallbackLocale: 'en', // 设置回退语言
messages
})

