refactor: 国际化文本迁移至全局 locales/messages.js

将组件级 i18n 对象重构为统一由全局 locales/messages.js 管理,确保中英文语言切换时正确显示对应文本。

- 新增 utils/i18n.js 国际化工具函数
- 更新 store/$t.mixin.js 翻译混入逻辑
- 迁移 pkgService、pkgBooking、pkgAccount、pkgExplore、pages 等共 58 个组件的中英文文本至全局消息表
This commit is contained in:
liangjian
2026-07-24 13:43:41 +08:00
parent 445bd850f4
commit 6e721ccc7e
58 changed files with 1810 additions and 4065 deletions

View File

@@ -1,13 +1,13 @@
<template>
<view class="booking-list-page tn-safe-area-inset-bottom">
<tn-nav-bar :isBack="true" :bottomShadow="false" backgroundColor="transparent">
<view class="tn-text-bold tn-text-xl tn-color-black">{{ t('navTitle') }}</view>
<view class="tn-text-bold tn-text-xl tn-color-black">{{ $tr('预订记录') }}</view>
</tn-nav-bar>
<view class="page-content tn-padding" :style="{ paddingTop: vuex_custom_bar_height + 'px' }">
<view v-if="loading" class="empty-card tn-padding-lg">
<view class="empty-title">{{ t('loadingTitle') }}</view>
<view class="empty-desc tn-margin-top-sm">{{ t('loadingDesc') }}</view>
<view class="empty-title">{{ $tr('订单加载中') }}</view>
<view class="empty-desc tn-margin-top-sm">{{ $tr('正在同步您的真实预订记录,请稍候。') }}</view>
</view>
<view v-else-if="bookingList.length">
<view
@@ -18,7 +18,7 @@
>
<view class="tn-flex tn-flex-row-between tn-flex-col-center">
<view>
<view class="booking-title">{{ item.roomTypeText || t('bookingFallbackTitle') }}</view>
<view class="booking-title">{{ item.roomTypeText || $tr('房源预订') }}</view>
<view class="booking-subtitle tn-margin-top-xs">{{ item.orderNo }}</view>
</view>
<view class="status-badge" :class="'status-' + item.tagType">
@@ -28,15 +28,15 @@
<view class="info-grid tn-margin-top">
<view class="info-row tn-flex tn-flex-row-between tn-margin-bottom-sm">
<text class="info-label">{{ t('buildingFloorLabel') }}</text>
<text class="info-label">{{ $tr('楼栋楼层') }}</text>
<text class="info-value">{{ item.buildingFloorText }}</text>
</view>
<view class="info-row tn-flex tn-flex-row-between tn-margin-bottom-sm">
<text class="info-label">{{ t('stayDateLabel') }}</text>
<text class="info-value">{{ item.startDateText }}{{ t('dateRangeJoiner') }}{{ item.endDateText }}</text>
<text class="info-label">{{ $tr('入住时间') }}</text>
<text class="info-value">{{ item.startDateText }}{{ $tr(' 至 ') }}{{ item.endDateText }}</text>
</view>
<view class="info-row tn-flex tn-flex-row-between">
<text class="info-label">{{ t('submittedAtLabel') }}</text>
<text class="info-label">{{ $tr('提交时间') }}</text>
<text class="info-value">{{ item.createdAtText }}</text>
</view>
</view>
@@ -44,10 +44,10 @@
</view>
<view v-else class="empty-card tn-padding-lg">
<view class="empty-title">{{ t('emptyTitle') }}</view>
<view class="empty-desc tn-margin-top-sm">{{ t('emptyDesc') }}</view>
<view class="empty-title">{{ $tr('暂无预订记录') }}</view>
<view class="empty-desc tn-margin-top-sm">{{ $tr('当前暂无预订记录,完成预订后会在这里展示。') }}</view>
<view class="custom-btn btn-primary tn-margin-top-lg" @click="goSelectRoom">
<text class="tn-text-bold">{{ t('goSelectRoom') }}</text>
<text class="tn-text-bold">{{ $tr('去选房') }}</text>
</view>
</view>
</view>
@@ -60,38 +60,6 @@ import { getSessionSnapshot } from '../../utils/app-state'
import { normalizeBookingList, parseOrderListResponse } from '../../utils/booking-helper'
export default {
i18n: {
zh: {
navTitle: '预订记录',
loadingTitle: '订单加载中',
loadingDesc: '正在同步您的真实预订记录,请稍候。',
bookingFallbackTitle: '房源预订',
buildingFloorLabel: '楼栋楼层',
stayDateLabel: '入住时间',
submittedAtLabel: '提交时间',
emptyTitle: '暂无预订记录',
emptyDesc: '当前暂无预订记录,完成预订后会在这里展示。',
goSelectRoom: '去选房',
cachedListShown: '网络异常,已展示最近同步记录',
loadFailed: '预订记录加载失败',
dateRangeJoiner: ' 至 '
},
en: {
navTitle: 'Booking Records',
loadingTitle: 'Loading bookings',
loadingDesc: 'Syncing your latest booking records. Please wait.',
bookingFallbackTitle: 'Room Booking',
buildingFloorLabel: 'Building / Floor',
stayDateLabel: 'Stay Dates',
submittedAtLabel: 'Submitted At',
emptyTitle: 'No booking records',
emptyDesc: 'No booking record is available yet. Completed bookings will appear here.',
goSelectRoom: 'Select Room',
cachedListShown: 'Network issue detected. Showing the latest synced records.',
loadFailed: 'Failed to load booking records',
dateRangeJoiner: ' to '
}
},
data() {
return {
bookingList: [],
@@ -112,9 +80,6 @@ export default {
await this.fetchBookingList()
},
methods: {
t(key, params) {
return this.$tm('pkgBooking.booking_list.booking_list', key, params)
},
getStoreUser() {
return (this.$store && this.$store.state && this.$store.state.vuex_user) || {}
},
@@ -156,8 +121,8 @@ export default {
this.applyBookingList(normalizeBookingList(cachedList, this.language))
uni.showToast({
title: this.bookingList.length
? this.t('cachedListShown')
: ((error && (error.message || error.msg)) || this.t('loadFailed')),
? this.$tr('网络异常,已展示最近同步记录')
: ((error && (error.message || error.msg)) || this.$tr('预订记录加载失败')),
icon: 'none'
})
})