feat(i18n): 中英文框架(命名空间字典+语言切换)+profile 接入参考+注册3个新页面
这个提交包含在:
@@ -1,5 +1,6 @@
|
||||
var api = require('../../utils/api')
|
||||
var config = require('../../config/env')
|
||||
var i18n = require('../../i18n/index')
|
||||
var app = getApp()
|
||||
|
||||
Page({
|
||||
@@ -16,9 +17,30 @@ Page({
|
||||
},
|
||||
|
||||
onShow: function () {
|
||||
i18n.bind(this)
|
||||
this.loadProfile()
|
||||
},
|
||||
|
||||
onLightInfo: function () {
|
||||
wx.navigateTo({ url: '/pages/light-info/light-info' })
|
||||
},
|
||||
|
||||
onSwitchLanguage: function () {
|
||||
var self = this
|
||||
var supported = i18n.SUPPORTED
|
||||
var names = supported.map(function (l) { return i18n.LOCALE_NAMES[l] || l })
|
||||
wx.showActionSheet({
|
||||
itemList: names,
|
||||
success: function (res) {
|
||||
var target = supported[res.tapIndex]
|
||||
if (target && target !== i18n.getLocale()) {
|
||||
i18n.setLocale(target)
|
||||
i18n.bind(self)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
loadProfile: function () {
|
||||
var self = this
|
||||
self.setData({ loading: true })
|
||||
@@ -33,9 +55,11 @@ Page({
|
||||
})
|
||||
|
||||
var p2 = api.getSubscription().then(function (sub) {
|
||||
var remaining = sub.remaining_days || 0
|
||||
self.setData({
|
||||
subscription: sub,
|
||||
subRemaining: sub.remaining_days || 0
|
||||
subRemaining: remaining,
|
||||
subRemainingText: i18n.t('profile.remainDays', { days: remaining })
|
||||
})
|
||||
}).catch(function (err) {
|
||||
console.error('getSubscription failed', err)
|
||||
@@ -50,19 +74,19 @@ Page({
|
||||
var self = this
|
||||
if (this.data.deviceCount > 0) {
|
||||
wx.showActionSheet({
|
||||
itemList: ['解绑当前设备'],
|
||||
itemList: [i18n.t('profile.unbindAction')],
|
||||
success: function (res) {
|
||||
if (res.tapIndex === 0) {
|
||||
wx.showModal({
|
||||
title: '确认解绑',
|
||||
content: '解绑后将无法使用该设备,确定要解绑吗?',
|
||||
title: i18n.t('profile.unbindConfirmTitle'),
|
||||
content: i18n.t('profile.unbindConfirmText'),
|
||||
success: function (modalRes) {
|
||||
if (modalRes.confirm) {
|
||||
api.unbindDevice().then(function () {
|
||||
wx.showToast({ title: '已解绑', icon: 'success' })
|
||||
wx.showToast({ title: i18n.t('profile.unbindDone'), icon: 'success' })
|
||||
self.loadProfile()
|
||||
}).catch(function (err) {
|
||||
wx.showToast({ title: err.message || '解绑失败', icon: 'none' })
|
||||
wx.showToast({ title: err.message || i18n.t('profile.unbindFailed'), icon: 'none' })
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -151,7 +175,7 @@ Page({
|
||||
var self = this
|
||||
var nickname = (self.data.editNickname || '').trim()
|
||||
if (!nickname) {
|
||||
wx.showToast({ title: '昵称不能为空', icon: 'none' })
|
||||
wx.showToast({ title: i18n.t('profile.nicknameRequired'), icon: 'none' })
|
||||
return
|
||||
}
|
||||
|
||||
@@ -170,18 +194,18 @@ Page({
|
||||
})
|
||||
}).then(function () {
|
||||
self.setData({ saving: false, editing: false })
|
||||
wx.showToast({ title: '保存成功', icon: 'success' })
|
||||
wx.showToast({ title: i18n.t('common.saveSuccess'), icon: 'success' })
|
||||
self.loadProfile()
|
||||
}).catch(function (err) {
|
||||
self.setData({ saving: false })
|
||||
wx.showToast({ title: err.message || '保存失败', icon: 'none' })
|
||||
wx.showToast({ title: err.message || i18n.t('common.saveFailed'), icon: 'none' })
|
||||
})
|
||||
},
|
||||
|
||||
onLogout: function () {
|
||||
wx.showModal({
|
||||
title: '退出登录',
|
||||
content: '确定要退出登录吗?',
|
||||
title: i18n.t('profile.logoutConfirmTitle'),
|
||||
content: i18n.t('profile.logoutConfirmText'),
|
||||
success: function (res) {
|
||||
if (res.confirm) {
|
||||
wx.removeStorageSync('token')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<view class="page">
|
||||
<view class="loading-container" wx:if="{{loading}}">
|
||||
<view class="loading-spinner"></view>
|
||||
<text class="loading-text">加载中...</text>
|
||||
<text class="loading-text">{{i18n.common.loading}}</text>
|
||||
</view>
|
||||
|
||||
<view class="page-content" wx:if="{{!loading}}">
|
||||
@@ -9,65 +9,76 @@
|
||||
<image class="user-avatar-img" wx:if="{{userInfo.avatar}}" src="{{userInfo.avatar}}" mode="aspectFill"></image>
|
||||
<view class="user-avatar" wx:else>👤</view>
|
||||
<view class="user-info">
|
||||
<view class="user-name">{{userInfo.nickname || '未登录'}}</view>
|
||||
<view class="user-name">{{userInfo.nickname || i18n.profile.notLoggedIn}}</view>
|
||||
<view class="user-phone">{{userInfo.phone || ''}}</view>
|
||||
</view>
|
||||
<view class="edit-profile-btn" bindtap="onEditProfile">编辑资料</view>
|
||||
<view class="edit-profile-btn" bindtap="onEditProfile">{{i18n.profile.editProfile}}</view>
|
||||
</view>
|
||||
|
||||
<view class="sub-card" wx:if="{{subscription && subscription.plan === 'free'}}">
|
||||
<view class="sub-left">
|
||||
<view class="sub-name">✨ 智能模式</view>
|
||||
<view class="sub-remain">已开放</view>
|
||||
<view class="sub-name">✨ {{i18n.profile.smartMode}}</view>
|
||||
<view class="sub-remain">{{i18n.profile.smartModeOpen}}</view>
|
||||
</view>
|
||||
<text class="status-badge status-badge-gold">免费</text>
|
||||
<text class="status-badge status-badge-gold">{{i18n.profile.free}}</text>
|
||||
</view>
|
||||
<view class="sub-card" wx:elif="{{subscription && subscription.status === 'active' && subRemaining > 0}}">
|
||||
<view class="sub-left">
|
||||
<view class="sub-name">✨ 智能模式</view>
|
||||
<view class="sub-remain">剩余 {{subRemaining}}天</view>
|
||||
<view class="sub-name">✨ {{i18n.profile.smartMode}}</view>
|
||||
<view class="sub-remain">{{subRemainingText}}</view>
|
||||
</view>
|
||||
<text class="status-badge status-badge-gold">使用中</text>
|
||||
<text class="status-badge status-badge-gold">{{i18n.profile.inUse}}</text>
|
||||
</view>
|
||||
<view class="sub-card sub-card-inactive" wx:else bindtap="onViewSubscription">
|
||||
<view class="sub-left">
|
||||
<view class="sub-name">智能模式</view>
|
||||
<view class="sub-remain">未订阅</view>
|
||||
<view class="sub-name">{{i18n.profile.smartMode}}</view>
|
||||
<view class="sub-remain">{{i18n.profile.notSubscribed}}</view>
|
||||
</view>
|
||||
<text class="status-badge" style="background:#eee;color:#999;">去订阅 ›</text>
|
||||
<text class="status-badge" style="background:#eee;color:#999;">{{i18n.profile.goSubscribe}}</text>
|
||||
</view>
|
||||
|
||||
<view class="menu-list">
|
||||
<view class="menu-item" bindtap="onManageDevice">
|
||||
<view class="menu-icon">📱</view>
|
||||
<view class="menu-text">我的设备</view>
|
||||
<text class="menu-device-status" wx:if="{{deviceCount > 0}}">已绑定</text>
|
||||
<text class="menu-device-status menu-device-unbound" wx:else>未绑定</text>
|
||||
<view class="menu-text">{{i18n.profile.menuDevice}}</view>
|
||||
<text class="menu-device-status" wx:if="{{deviceCount > 0}}">{{i18n.profile.bound}}</text>
|
||||
<text class="menu-device-status menu-device-unbound" wx:else>{{i18n.profile.unbound}}</text>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
<view class="menu-item" bindtap="onViewHistory">
|
||||
<view class="menu-icon">📋</view>
|
||||
<view class="menu-text">使用记录</view>
|
||||
<view class="menu-text">{{i18n.profile.menuHistory}}</view>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
<view class="menu-item" bindtap="onViewSubscription" wx:if="{{!subscription || subscription.plan !== 'free'}}">
|
||||
<view class="menu-icon">💳</view>
|
||||
<view class="menu-text">订阅管理</view>
|
||||
<view class="menu-text">{{i18n.profile.menuSubscription}}</view>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
<view class="menu-item" bindtap="onLightInfo">
|
||||
<view class="menu-icon">💡</view>
|
||||
<view class="menu-text">{{i18n.profile.menuLightInfo}}</view>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
<view class="menu-item" bindtap="onHelp">
|
||||
<view class="menu-icon">❓</view>
|
||||
<view class="menu-text">使用帮助</view>
|
||||
<view class="menu-text">{{i18n.profile.menuHelp}}</view>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
<view class="menu-item" bindtap="onContact">
|
||||
<view class="menu-icon">📞</view>
|
||||
<view class="menu-text">联系我们</view>
|
||||
<view class="menu-text">{{i18n.profile.menuContact}}</view>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
<view class="menu-item" bindtap="onSwitchLanguage">
|
||||
<view class="menu-icon">🌐</view>
|
||||
<view class="menu-text">{{i18n.profile.language}}</view>
|
||||
<text class="menu-device-status">{{locale === 'en' ? 'English' : '中文'}}</text>
|
||||
<text class="menu-arrow">›</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="logout-btn" bindtap="onLogout">退出登录</view>
|
||||
<view class="logout-btn" bindtap="onLogout">{{i18n.profile.logout}}</view>
|
||||
|
||||
<view class="version-text">v0.1.8</view>
|
||||
</view>
|
||||
@@ -75,19 +86,19 @@
|
||||
<!-- Edit profile modal -->
|
||||
<view class="edit-mask" wx:if="{{editing}}" bindtap="onCancelEdit"></view>
|
||||
<view class="edit-modal" wx:if="{{editing}}">
|
||||
<view class="edit-modal-title">编辑资料</view>
|
||||
<view class="edit-modal-title">{{i18n.profile.editProfileTitle}}</view>
|
||||
<view class="edit-avatar-row" bindtap="onPickAvatar">
|
||||
<image class="edit-avatar-img" wx:if="{{editAvatarUrl}}" src="{{editAvatarUrl}}" mode="aspectFill"></image>
|
||||
<view class="edit-avatar-placeholder" wx:else>👤</view>
|
||||
<text class="edit-avatar-hint">点击更换头像</text>
|
||||
<text class="edit-avatar-hint">{{i18n.profile.changeAvatar}}</text>
|
||||
</view>
|
||||
<view class="edit-field">
|
||||
<text class="edit-label">昵称</text>
|
||||
<input class="edit-input" value="{{editNickname}}" bindinput="onEditNicknameInput" placeholder="请输入昵称" maxlength="20" />
|
||||
<text class="edit-label">{{i18n.profile.nickname}}</text>
|
||||
<input class="edit-input" value="{{editNickname}}" bindinput="onEditNicknameInput" placeholder="{{i18n.profile.nicknamePlaceholder}}" maxlength="20" />
|
||||
</view>
|
||||
<view class="edit-actions">
|
||||
<button class="btn-secondary edit-btn" bindtap="onCancelEdit">取消</button>
|
||||
<button class="btn-primary edit-btn" bindtap="onSaveProfile" disabled="{{saving}}" loading="{{saving}}">保存</button>
|
||||
<button class="btn-secondary edit-btn" bindtap="onCancelEdit">{{i18n.common.cancel}}</button>
|
||||
<button class="btn-primary edit-btn" bindtap="onSaveProfile" disabled="{{saving}}" loading="{{saving}}">{{i18n.common.save}}</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
在新工单中引用
屏蔽一个用户