feat(i18n): 剩余15页全量接入中英(登录/注册/扫码/绑定/佩戴/扫描/治疗/订阅/帮助等)

- 3 个并行 agent 各管 5 页,互不重叠命名空间
- 全 App 18 页均 i18n.bind,22 命名空间/400 键中英对齐
- 动态文案(时长/天数/价格/区域)JS 内 i18n.t 计算;区域标签复用 common.regions
这个提交包含在:
Guoguo
2026-07-19 06:00:04 -07:00
父节点 f5eaf05067
当前提交 4466c53c7b
修改 45 个文件,包含 842 行新增268 行删除
@@ -4,11 +4,11 @@ Page({
data: {
statusBarHeight: 44,
regions: [
{ name: '右区', mask: 0x01, checked: true },
{ name: '左区', mask: 0x02, checked: true },
{ name: '上区', mask: 0x04, checked: true },
{ name: '中区', mask: 0x08, checked: true },
{ name: '下区', mask: 0x10, checked: true }
{ name: '', mask: 0x01, checked: true },
{ name: '', mask: 0x02, checked: true },
{ name: '', mask: 0x04, checked: true },
{ name: '', mask: 0x08, checked: true },
{ name: '', mask: 0x10, checked: true }
],
selectedMode: 0,
subExpired: false,
@@ -34,6 +34,15 @@ Page({
var app = getApp()
this.setData({ statusBarHeight: app.globalData.statusBarHeight })
i18n.bind(this)
var regionKeys = ['right', 'left', 'top', 'middle', 'bottom']
var regions = this.data.regions
regions.forEach(function (r, i) {
r.name = i18n.t('common.regions.' + regionKeys[i])
})
this.setData({
regions: regions,
subDaysText: i18n.t('setup.remainDays', { days: this.data.subDays })
})
this.checkSubscription()
},
@@ -43,7 +52,8 @@ Page({
http.get('/api/v1/subscription').then(function (sub) {
self.setData({
subExpired: sub.status !== 'active',
subDays: sub.remaining_days || 0
subDays: sub.remaining_days || 0,
subDaysText: i18n.t('setup.remainDays', { days: sub.remaining_days || 0 })
})
}).catch(function () {})
},
@@ -79,7 +89,7 @@ Page({
})
if (mask === 0) {
wx.showToast({ title: '请至少选择一个区域', icon: 'none' })
wx.showToast({ title: i18n.t('setup.noRegion'), icon: 'none' })
return
}
@@ -109,7 +119,7 @@ Page({
'&mode=' + self.data.selectedMode
})
}).catch(function (err) {
self.setData({ submitting: false, error: err.error_msg || '启动失败' })
self.setData({ submitting: false, error: err.error_msg || i18n.t('setup.startFailed') })
})
},
@@ -1,40 +1,40 @@
<view class="page">
<view class="page-header page-header-pink" style="padding-top: {{statusBarHeight + 24}}px;">
<view class="nav-back" bindtap="onBack"> 返回</view>
<view class="page-header-title">使用设置</view>
<view class="page-header-subtitle">选择模式和区域</view>
<view class="nav-back" bindtap="onBack"> {{i18n.common.back}}</view>
<view class="page-header-title">{{i18n.setup.title}}</view>
<view class="page-header-subtitle">{{i18n.setup.subtitle}}</view>
</view>
<view class="page-content">
<view class="page-title">选择模式</view>
<view class="page-title">{{i18n.setup.selectMode}}</view>
<view class="mode-selector">
<view class="mode-option {{selectedMode === 0 ? 'active' : ''}}" bindtap="onSelectMode" data-value="0">
<text class="mode-icon">🔄</text>
<view class="mode-label">普通模式</view>
<view class="mode-sub">6色循环</view>
<view class="mode-label">{{i18n.setup.normalMode}}</view>
<view class="mode-sub">{{i18n.setup.normalModeSub}}</view>
</view>
<view class="mode-option {{selectedMode === 1 ? 'active' : ''}} {{subExpired ? 'locked' : ''}}" bindtap="onSelectMode" data-value="1">
<text class="mode-icon">✨</text>
<view class="mode-label">智能模式</view>
<view class="mode-sub" wx:if="{{!subExpired}}">剩余{{subDays}}</view>
<view class="mode-sub" wx:else>订阅解锁</view>
<view class="mode-label">{{i18n.setup.smartMode}}</view>
<view class="mode-sub" wx:if="{{!subExpired}}">{{subDaysText}}</view>
<view class="mode-sub" wx:else>{{i18n.setup.subscribeUnlock}}</view>
</view>
</view>
<view class="page-title" style="font-size:28rpx;">选择区域</view>
<view class="mode-tip" wx:if="{{selectedMode === 0}}">普通模式固定 10 分钟,使用区域默认全区域,不可调整</view>
<view class="page-title" style="font-size:28rpx;">{{i18n.setup.selectRegion}}</view>
<view class="mode-tip" wx:if="{{selectedMode === 0}}">{{i18n.setup.normalTip}}</view>
<view class="face-map">
<view class="face-region forehead {{regions[2].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="2">上区</view>
<view class="face-region left-cheek {{regions[1].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="1">左区</view>
<view class="face-region right-cheek {{regions[0].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="0">右区</view>
<view class="face-region nose {{regions[3].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="3">中区</view>
<view class="face-region chin {{regions[4].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="4">下区</view>
<view class="face-region forehead {{regions[2].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="2">{{i18n.common.regions.top}}</view>
<view class="face-region left-cheek {{regions[1].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="1">{{i18n.common.regions.left}}</view>
<view class="face-region right-cheek {{regions[0].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="0">{{i18n.common.regions.right}}</view>
<view class="face-region nose {{regions[3].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="3">{{i18n.common.regions.middle}}</view>
<view class="face-region chin {{regions[4].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="4">{{i18n.common.regions.bottom}}</view>
</view>
<button class="btn-primary" bindtap="onStart" disabled="{{submitting}}" loading="{{submitting}}">
开始使用
{{i18n.setup.startBtn}}
</button>
<view class="manual-entry" bindtap="onManual" style="text-align:center;color:#E8503A;font-size:26rpx;margin-top:28rpx;">{{i18n.manual.entryLink}}</view>