fixed:i18转译app端失败问题修复

master
黄伟杰 2 weeks ago
parent e59ea0057f
commit f97828400b

@ -37,10 +37,10 @@
<view class="todo-dot"></view>
<view class="todo-content">
<view class="todo-item-title">{{ item.name }}</view>
<view class="todo-sub">{{ t('dashboard.taskCode', { value: item.code }) }}</view>
<view class="todo-sub">{{ t('dashboard.taskType', { value: item.type }) }}</view>
<view class="todo-sub">{{ t('dashboard.taskTarget', { value: item.deviceName }) }}</view>
<view class="todo-sub">{{ t('dashboard.createTime', { value: formatDate(item.createTime) }) }}</view>
<view class="todo-sub">{{ translateWithParams('dashboard.taskCode', { value: item.code }) }}</view>
<view class="todo-sub">{{ translateWithParams('dashboard.taskType', { value: item.type }) }}</view>
<view class="todo-sub">{{ translateWithParams('dashboard.taskTarget', { value: item.deviceName }) }}</view>
<view class="todo-sub">{{ translateWithParams('dashboard.createTime', { value: formatDate(item.createTime) }) }}</view>
</view>
</view>
</view>
@ -53,6 +53,7 @@
<script setup>
import { ref, reactive, computed, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { translateWithParams } from '@/locales'
import request from '@/utils/request'
const { t } = useI18n()

@ -11,6 +11,29 @@ const messages = {
'en-US': enUS
}
function unwrapMessageParam(value) {
if (value && typeof value === 'object' && 'value' in value) {
return value.value
}
return value
}
function normalizeMessageParams(params = {}) {
return Object.keys(params).reduce((result, key) => {
result[key] = unwrapMessageParam(params[key])
return result
}, {})
}
function replaceMessageParams(message, params = {}) {
if (typeof message !== 'string') return message
return Object.keys(params).reduce((result, key) => {
const pattern = new RegExp(`\\{\\s*${key}\\s*\\}`, 'g')
const value = params[key]
return result.replace(pattern, value == null ? '' : String(value))
}, message)
}
function normalizeLocale(locale) {
if (locale === 'zh' || locale === 'zh_CN' || locale === 'zh-Hans') return 'zh-CN'
if (locale === 'en' || locale === 'en_US') return 'en-US'
@ -40,6 +63,17 @@ const i18n = createI18n({
missing: (locale, key) => key
})
const rawGlobalTranslate = i18n.global.t.bind(i18n.global)
i18n.global.t = (...args) => {
const translated = rawGlobalTranslate(...args)
const paramsArg = args.find((arg) => arg && typeof arg === 'object' && !Array.isArray(arg))
if (!paramsArg) {
return translated
}
return replaceMessageParams(translated, normalizeMessageParams(paramsArg))
}
const literalMap = {
'首页': 'nav.home',
'报表': 'tab.report',
@ -102,6 +136,12 @@ export function translateLiteral(text) {
return text
}
export function translateWithParams(key, params = {}) {
const normalizedParams = normalizeMessageParams(params)
const translated = i18n.global.t(key, normalizedParams)
return replaceMessageParams(translated, normalizedParams)
}
export function initializeLocale() {
setLocale(getSavedLocale())
}

@ -14,7 +14,7 @@
</view>
<view v-if="name" @click="handleToInfo" class="user-info">
<view class="u_title">
{{ t('mine.username', { name }) }}
{{ translateWithParams('mine.username', { name }) }}
</view>
</view>
</view>
@ -69,7 +69,7 @@
import { computed, onUnmounted, ref } from "vue";
import { useI18n } from 'vue-i18n'
import useUserStore from '@/store/modules/user'
import { onLocaleChange, offLocaleChange } from '@/locales'
import { onLocaleChange, offLocaleChange, translateWithParams } from '@/locales'
import NavBar from '@/components/common/NavBar.vue'
import TabBar from '@/components/common/TabBar.vue'

@ -14,7 +14,7 @@
</view>
<view v-if="name" @click="handleToInfo" class="user-info">
<view class="u_title">
{{ t('mine.username', { name }) }}
{{ translateWithParams('mine.username', { name }) }}
</view>
</view>
</view>
@ -69,7 +69,7 @@
import { computed, onUnmounted, ref } from "vue";
import { useI18n } from 'vue-i18n'
import useUserStore from '@/store/modules/user'
import { onLocaleChange, offLocaleChange } from '@/locales'
import { onLocaleChange, offLocaleChange, translateWithParams } from '@/locales'
import NavBar from '@/components/common/NavBar.vue'
import TabBar from '@/components/common/TabBar.vue'

@ -63,6 +63,7 @@
import { ref, computed, reactive, onMounted } from 'vue'
import { onReachBottom, onShow } from '@dcloudio/uni-app'
import { useI18n } from 'vue-i18n'
import { translateWithParams } from '@/locales'
import request from '@/utils/request'
import NavBar from '@/components/common/NavBar.vue'
@ -90,7 +91,7 @@ function formatDateTime(ms) {
}
function handleItemClick(item) {
uni.showToast({ title: t('planList.viewDetail', { code: item.taskCode }), icon: 'none' })
uni.showToast({ title: translateWithParams('planList.viewDetail', { code: item.taskCode }), icon: 'none' })
}
async function loadPlanList(reset = false) {

@ -7,14 +7,14 @@
<view class="iconfont icon-global menu-icon"></view>
<view>{{ t('setting.language') }}</view>
</view>
<view class="text-grey">{{ t('setting.currentLanguage', { language: currentLanguageLabel }) }}</view>
<view class="text-grey">{{ translateWithParams('setting.currentLanguage', { language: currentLanguageLabel }) }}</view>
</view>
<view class="list-cell list-cell-arrow" @click="handleTerminalChange">
<view class="menu-item-box">
<view class="iconfont icon-phone menu-icon"></view>
<view>{{ t('setting.terminalMode') }}</view>
</view>
<view class="text-grey">{{ t('setting.currentTerminal', { terminal: currentTerminalLabel }) }}</view>
<view class="text-grey">{{ translateWithParams('setting.currentTerminal', { terminal: currentTerminalLabel }) }}</view>
</view>
<view class="list-cell list-cell-arrow" @click="handleToPwd">
<view class="menu-item-box">
@ -44,7 +44,7 @@
import { computed, ref } from "vue";
import { useI18n } from 'vue-i18n'
import useUserStore from '@/store/modules/user'
import { getCurrentLocale, setLocale } from '@/locales'
import { getCurrentLocale, setLocale, translateWithParams } from '@/locales'
import NavBar from '@/components/common/NavBar.vue'
import { getTerminalType, setTerminalType, TERMINAL_TYPE_MOBILE, TERMINAL_TYPE_SCANNER } from '@/utils/terminal'
@ -117,7 +117,7 @@ function handleTerminalChange() {
try {
await userStore.refreshPermissionInfo()
uni.showToast({
title: t('setting.terminalSwitched', { terminal: currentTerminalLabel.value }),
title: translateWithParams('setting.terminalSwitched', { terminal: currentTerminalLabel.value }),
icon: 'none',
duration: 1000
})

Loading…
Cancel
Save