feat: 语言切换功能页面推进

This commit is contained in:
hzj 2026-04-29 15:20:41 +08:00
parent 372fa1a1a7
commit f98799bb3f
13 changed files with 583 additions and 57 deletions

View File

@ -63,10 +63,17 @@
- 状态:待处理
- 已完成:`src/components/data/PropsRow/index.vue`线程一2026-04-27
- 已完成:`src/components/data/RoomDeatilsDrawer/index.vue`线程一2026-04-28
- 已完成:`src/components/data/AssociatedResources/index.vue`线程三2026-04-28
- 已完成:`src/components/data/GiftSelect/index.vue`线程一2026-04-28
- 已完成:`src/components/data/PropsSourceSelectPopover/index.vue`线程二2026-04-28
- 已完成:`src/components/data/PropsSourceSelectDrawer/index.vue`线程二2026-04-28
- 已完成:`src/components/data/Gender/index.vue`线程一2026-04-28
- 已完成:`src/components/IconsPanel/index.vue`线程一2026-04-28
- 已复核保留:`src/components/data/AccountHanle/index.vue`线程一2026-04-28唯一中文为接口提交内容
- 说明:已发现不止 `用户列表 / User List` 使用仍需复核的 `src/components/**` 公共组件;所有已完成主要路由页面都需要按 `docs/i18n/翻译清单.md` 中“对已完成主要路由页面做直接公共组件联动复查”清单逐项确认
- 优先建议:
- 继续处理被多个已完成页面复用的公共组件,例如 `src/components/data/RoomDeatilsDrawer/index.vue`
- 再处理高频业务弹窗 / 抽屉,例如用户列表直接渲染的流水、充值、扣除、违规记录等组件
- 继续处理高频业务弹窗 / 抽屉,例如用户列表直接渲染的流水、充值、扣除、违规记录等组件
### 当前接口返回的主要路由树(整理版)

View File

@ -177,14 +177,295 @@
| 线程 | 当前状态 | 认领范围 | 说明 |
| --- | --- | --- | --- |
| 线程一 | 进行中 | `src/components/data/RoomDeatilsDrawer/index.vue` | 2026-04-27 认领公共组件联动复查:处理房间详情抽屉组件展示文本 |
| 线程二 | 待分配 | 未认领 | 2026-04-27 已完成 `src/views/sys/menu-manager/index.vue` 系统管理 / 菜单管理页面国际化、中文残留扫描、构建验证与 md 同步 |
| 线程三 | 待分配 | 未认领 | 2026-04-27 已完成 `src/views/sys/role-manager` 系统管理 / 角色管理页面国际化,本轮结束后切回待分配 |
| 线程一 | 待分配 | 未认领 | 2026-04-28 已完成 `src/components/IconsPanel/index.vue` 公共组件联动复查、中文残留扫描、语言文件语法检查、构建验证与 md 同步 |
| 线程二 | 待分配 | 未认领 | 2026-04-28 已完成 `src/components/data/PropsSourceSelectDrawer/index.vue` 公共组件联动复查、中文残留扫描、构建验证与 md 同步 |
| 线程三 | 待分配 | 未认领 | 2026-04-28 已完成 `src/components/data/AssociatedResources/index.vue` 公共组件联动复查,本轮结束后切回待分配 |
| 线程四 | 待分配 | 未认领 | 避免和其他线程同时编辑同一语言模块 |
## 最新认领记录
- 2026-04-27
- 2026-04-28
- 线程一已复核保留:`src/components/data/AccountHanle/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/user/user-table/index.vue`
- 复核结论:
- 唯一中文命中为 WARNING 状态下写入 `form.description` 的默认警告内容
- 该内容会作为 `accountHandle(that.form)` 的提交内容,同时会作为 `translateUserLangContent` 的输入内容
- 按“不要修改接口参数、后端依赖值、提交值”的规则保留原文,不接入语言包
- 补充说明:
- 本项未修改源码
- 后续扫描如再次命中该中文,应按“提交内容保留”处理,不作为展示文本任务重复领取
- 2026-04-28
- 线程一已完成:`src/components/IconsPanel/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/sys/menu-manager/menu-edit.vue`
- 完成范围包括:
- Icons 面板弹窗标题国际化
- 新增 `pages.sysMenuManager.dialog.iconsPanelTitle`
- 中文残留扫描
- 语言文件语法检查
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- 未修改接口参数、路由路径、权限码、icon 名称实际值或提交值
- `src/components/IconsPanel/index.vue` 当前无中文残留
- 已执行语言文件语法检查,通过
- 已执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod`,构建通过
- 当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程一本轮完成后切回待分配
- 2026-04-28
- 线程一已新认领:`src/components/IconsPanel/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/sys/menu-manager/menu-edit.vue`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已确认线程一当前未认领新任务
- 已确认当前无其他线程认领 `src/components/IconsPanel/index.vue`
- 认领范围包括:
- 组件内静态展示文本翻译
- 必要的页面级语言 key 补充或复用
- 中文残留扫描、语言文件语法检查、构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 不包含:
- 接口参数
- 路由路径
- 权限码
- icon 名称实际值或提交值
- 2026-04-28
- 线程一已完成:`src/components/data/Gender/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/user/im-account-manager/index.vue`
- 完成范围包括:
- 组件默认性别标题展示兜底国际化
- 复用已有 `pages.userBaseInfo.words.male`
- 中文残留扫描
- 语言文件语法检查
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- 未修改接口参数、路由路径、权限码、后端依赖值或提交值
- 外部传入的 `genderName` 和接口返回性别名称仍按原值优先展示,仅在未传入时使用语言包兜底
- `src/components/data/Gender/index.vue` 当前无中文残留
- 已执行语言文件语法检查,通过
- 已执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod`,构建通过
- 当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程一本轮完成后切回待分配
- 2026-04-28
- 线程二已完成:`src/components/data/PropsSourceSelectDrawer/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 完成范围包括:
- 抽屉标题国际化
- 道具类型与道具名称 / ID placeholder 国际化
- 悬浮“点击选择”提示国际化
- 本地资源类型名称改为复用 `pages.propsSourceGroupForm.resourceType`
- 新增 `pages.propsSourceSelectDrawer`
- 中文残留扫描
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- 未修改接口参数、路由路径、权限码、查询逻辑、选择事件、资源类型实际值或提交值
- 接口返回的资源名称、图片、SVGA 地址与资源数据保持原样
- `src/components/data/PropsSourceSelectDrawer/index.vue` 当前无中文残留
- 直接执行 `npm run build:prod` 在当前 Node 22 环境触发 `ERR_OSSL_EVP_UNSUPPORTED`
- 已按项目文档备用方案执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod`,构建通过
- 当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程二本轮完成后切回待分配
- 2026-04-28
- 线程二已新认领:`src/components/data/PropsSourceSelectDrawer/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/game/egg/egg-lottery-cnf/index.vue`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已重新读取 `src/lang/messages/pages/en.js`
- 已重新读取 `src/lang/messages/pages/zh.js`
- 已确认线程一当前认领 `src/components/data/Gender/index.vue`,线程二本轮避开该文件
- 已确认当前无其他线程认领 `src/components/data/PropsSourceSelectDrawer/index.vue`
- 认领范围包括:
- 组件内静态展示文本翻译
- 本地资源类型名称展示层国际化
- 必要的页面级语言 key 补充或复用
- 中文残留扫描、语言文件语法检查、构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 不包含:
- 接口参数
- 路由路径
- 权限码
- 后端依赖值或提交值
- 接口返回的资源名称、图片、SVGA 地址与资源数据
- 2026-04-28
- 线程一已新认领:`src/components/data/Gender/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/user/im-account-manager/index.vue`
- 认领范围包括:
- 组件内静态展示文本翻译
- 必要的页面级语言 key 补充或复用
- 中文残留扫描、语言文件语法检查、构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 不包含:
- 接口参数
- 路由路径
- 权限码
- 后端依赖值
- 2026-04-28
- 线程三已完成:`src/components/data/AssociatedResources/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/activity/template-cnf/reward-edit.vue`
- 完成范围包括:
- 抽屉标题、筛选 placeholder、搜索按钮、上下架本地展示标签、确认选择按钮国际化
- 新增 `pages.associatedResources`
- 中文残留扫描
- 语言文件语法检查
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- 未修改接口参数、路由路径、权限码、分页逻辑、查询逻辑、选择逻辑、上下架实际布尔值、后端依赖值或提交值
- 接口返回的资源组名称、奖品名称、图片、SVGA 地址与奖品资源数据按原值展示
- `src/components/data/AssociatedResources/index.vue` 当前无中文残留
- 直接执行 `npm run build:prod` 因当前 Node 22 / webpack OpenSSL 兼容问题报 `ERR_OSSL_EVP_UNSUPPORTED`
- 按协作文档兜底执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过,当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程三本轮完成后切回待分配
- 2026-04-28
- 线程二已完成:`src/components/data/PropsSourceSelectPopover/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 完成范围包括:
- 筛选输入框 placeholder 国际化
- 默认“选择”按钮文案国际化
- 新增 `pages.propsSourceSelectPopover`
- 中文残留扫描
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- `item[property.label]`、图片、SVGA 地址、筛选数据与选择事件保持原样
- 直接执行 `npm run build:prod` 在 Node 22 下触发 `ERR_OSSL_EVP_UNSUPPORTED`,已按文档备用方案执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 并通过
- 当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程二本轮完成后切回待分配
- 2026-04-28
- 线程一已完成:`src/components/data/GiftSelect/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 完成范围包括:
- 礼物选择抽屉标题国际化,并保留 `giftSize` 计数展示
- 搜索输入框 placeholder 国际化
- 礼物卡片悬浮“点击选择”国际化
- 新增 `pages.giftSelect`
- 中文残留扫描
- 语言文件语法检查
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- `sysOrigin`、礼物列表接口、筛选字段、`giftName` / `giftCode` / `giftCandy` 等接口返回数据保持原样
- 直接执行 `npm run build:prod` 在当前 Node 22 环境触发 `ERR_OSSL_EVP_UNSUPPORTED`
- 已按项目文档备用方案执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod`,构建通过
- 当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程一本轮完成后切回待分配
- 2026-04-28
- 线程二已新认领:`src/components/data/PropsSourceSelectPopover/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/cnf/lottery/select-prize.vue`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已重新读取 `src/lang/messages/pages/en.js`
- 已重新读取 `src/lang/messages/pages/zh.js`
- 已确认线程一当前认领 `src/components/data/GiftSelect/index.vue`,线程二本轮避开该文件
- 已确认线程三当前认领 `src/components/data/AssociatedResources/index.vue`,线程二本轮避开该文件
- 已确认当前无其他线程认领 `src/components/data/PropsSourceSelectPopover/index.vue`
- 认领范围包括:
- 组件内静态展示文本翻译
- 必要的页面级语言 key 补充或复用
- 中文残留扫描、语言文件语法检查、构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 不包含:
- 接口参数
- 路由路径
- 权限码
- 后端依赖值
- 接口返回的资源名称、图片、SVGA 地址与筛选数据
- 2026-04-28
- 线程三已新认领:`src/components/data/AssociatedResources/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/activity/template-cnf/reward-edit.vue`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已重新读取 `src/lang/messages/pages/en.js`
- 已重新读取 `src/lang/messages/pages/zh.js`
- 已确认线程一当前认领 `src/components/data/GiftSelect/index.vue`,线程三本轮避开该文件
- 已确认当前无其他线程认领 `src/components/data/AssociatedResources/index.vue`
- 认领范围包括:
- 组件内静态展示文本翻译
- 必要的页面级语言 key 补充或复用
- 中文残留扫描、语言文件语法检查、构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 不包含:
- 接口参数
- 路由路径
- 权限码
- 后端依赖值或提交值
- 接口返回的资源组名称与奖品资源数据
- 2026-04-28
- 线程一已新认领:`src/components/data/GiftSelect/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:
- `src/views/activity/template-cnf/form-edit.vue`
- 认领范围包括:
- 组件内静态展示文本翻译
- 必要的页面级语言 key 补充或复用
- 中文残留扫描、语言文件语法检查、构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 不包含:
- 接口参数
- 路由路径
- 权限码
- 后端依赖值
- 2026-04-28
- 线程一已完成:`src/components/data/RoomDeatilsDrawer/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 完成范围包括:
- 抽屉标题“房间资料详情”国际化
- 新增 `pages.roomDetailsDrawer.dialog.title`
- 中文残留扫描
- 语言文件语法检查
- 构建验证
- `docs/i18n/翻译进度.md``docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 与本文件同步更新
- 补充说明:
- 保留现有文件名 `RoomDeatilsDrawer` 拼写和引用路径,未做重命名
- `roomId``RoomInfo` 子组件、关闭事件、基础信息回调与接口数据保持原样
- `npm run build:prod` 已通过,当前仍保留项目既有 `17` 条 warning未新增阻塞错误
- 线程一本轮完成后切回待分配
- 2026-04-28
- 线程一已新认领:`src/components/data/RoomDeatilsDrawer/index.vue`
- 任务类型:已完成主要路由页面的直接公共组件联动复查
- 关联页面包括:

View File

@ -281,6 +281,11 @@
- `src/views/tools/other/user-swap-user.vue`
- `src/views/game/ludo/index.vue`
- `src/components/data/PropsRow/index.vue`
- `src/components/data/RoomDeatilsDrawer/index.vue`
- `src/components/data/GiftSelect/index.vue`
- `src/components/data/AssociatedResources/index.vue`
- `src/components/data/PropsSourceSelectPopover/index.vue`
- `src/components/data/PropsSourceSelectDrawer/index.vue`
- 表格展示适配:表头自动换行 + 默认最小宽度补齐
- 表格展示适配:表头 `.cell` 高度自适应 + 纵向居中修正
- 表单展示适配:标题纵向居中
@ -316,16 +321,39 @@
- 完成线程:线程一
- 关联页面:活动管理、砸金蛋记录、抽奖概率配置、资源组配置、代理钻石政策、代理政策等已完成页面
- 说明:组件内可见“永久”已国际化;剩余中文仅为注释,不属于可见展示文案
- `src/components/data/RoomDeatilsDrawer/index.vue`
- 完成线程:线程一
- 关联页面Ludo飞行棋、房间资料列表等已完成页面
- 说明:组件内抽屉标题已国际化;保留现有文件名拼写,不做重命名
- `src/components/data/GiftSelect/index.vue`
- 完成线程:线程一
- 关联页面:活动管理页面
- 说明:组件内礼物选择标题、搜索 placeholder 与悬浮选择提示已国际化;接口返回礼物数据保持原样
- `src/components/data/AssociatedResources/index.vue`
- 完成线程:线程三
- 关联页面:活动管理奖励编辑等已完成页面
- 说明:组件内抽屉标题、筛选 placeholder、搜索按钮、上下架本地展示标签与确认选择按钮已国际化接口返回的资源组名称与奖品资源数据保持原样
- `src/components/data/PropsSourceSelectPopover/index.vue`
- 完成线程:线程二
- 关联页面:抽奖配置奖品选择弹窗等已完成页面
- 说明:组件内筛选 placeholder 与默认选择按钮文案已国际化接口返回的资源名称、图片、SVGA 地址与筛选数据保持原样
- `src/components/data/PropsSourceSelectDrawer/index.vue`
- 完成线程:线程二
- 关联页面:砸金蛋配置页等已完成页面
- 说明:组件内抽屉标题、筛选 placeholder、悬浮选择提示与本地资源类型名称已国际化接口返回的资源名称、图片、SVGA 地址与资源数据保持原样
- `src/components/data/Gender/index.vue`
- 完成线程:线程一
- 关联页面IM账号管理页面
- 说明:组件默认性别标题展示兜底已国际化并复用 `pages.userBaseInfo.words.male`;外部传入的 `genderName` 与接口返回性别名称保持原样优先展示
- `src/components/IconsPanel/index.vue`
- 完成线程:线程一
- 关联页面:菜单管理页面
- 说明组件弹窗标题已国际化icon 名称、icon 值与选择回传值保持原样
- `src/components/data/AccountHanle/index.vue`
- 完成线程:线程一
- 关联页面:用户列表页面
- 说明:唯一中文命中为 WARNING 状态下写入 `form.description` 的默认警告提交内容,后续会提交给 `accountHandle` 并可作为翻译接口输入;按接口提交值保留,不做语言包替换
- 当前扫描到仍需复核的“已完成页面 -> 直接公共组件”:
- `src/views/activity/template-cnf/form-edit.vue` -> `src/components/data/GiftSelect/index.vue`(中文命中 3
- `src/views/activity/template-cnf/reward-edit.vue` -> `src/components/data/AssociatedResources/index.vue`(中文命中 9
- `src/views/cnf/lottery/select-prize.vue` -> `src/components/data/PropsSourceSelectPopover/index.vue`(中文命中 2
- `src/views/game/egg/egg-lottery-cnf/index.vue` -> `src/components/data/PropsSourceSelectDrawer/index.vue`(中文命中 16
- `src/views/game/ludo/index.vue` -> `src/components/data/RoomDeatilsDrawer/index.vue`(中文命中 1
- `src/views/room/profile/index.vue` -> `src/components/data/RoomDeatilsDrawer/index.vue`(中文命中 1
- `src/views/sys/menu-manager/menu-edit.vue` -> `src/components/IconsPanel/index.vue`(中文命中 2
- `src/views/user/im-account-manager/index.vue` -> `src/components/data/Gender/index.vue`(中文命中 1
- `src/views/user/user-table/index.vue` -> `src/components/data/AccountHanle/index.vue`(中文命中 1历史保留默认“警告”属于提交内容
- `src/views/user/user-table/index.vue` -> `src/components/data/AddOtherRecharge/index.vue`(中文命中 17
- `src/views/user/user-table/index.vue` -> `src/components/data/AddOtherRechargeDialog/index.vue`(中文命中 6
- `src/views/user/user-table/index.vue` -> `src/components/data/DiamondRunningWaterDialog/index.vue`(中文命中 8

View File

@ -116,6 +116,59 @@
## 本轮新增进展
### 2026-04-28
- 已复核并保留:
- `src/components/data/AccountHanle/index.vue`
- 说明:唯一中文命中为 WARNING 状态下写入 `form.description` 的默认警告内容,会作为 `accountHandle(that.form)` 提交内容并可作为 `translateUserLangContent` 输入;按接口提交值 / 后端依赖内容保留,不接入语言包
- 已完成公共组件联动复查:
- `src/components/IconsPanel/index.vue`
- 说明:已完成菜单管理页面直接复用的 Icons 面板弹窗标题国际化;新增 `pages.sysMenuManager.dialog.iconsPanelTitle`icon 名称、icon 值与选择回传值保持原样
- 已补充页面级语言 key
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 新增范围:`pages.sysMenuManager.dialog.iconsPanelTitle`
- 已完成验证:
- `src/components/IconsPanel/index.vue` 中文残留扫描通过,当前无中文命中
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法检查通过
- 已执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过
- 说明:当前仍保留项目既有 `17` 条 warning未因本轮 `IconsPanel` 国际化改动新增阻塞错误
- 已完成公共组件联动复查:
- `src/components/data/Gender/index.vue`
- 说明:已完成 IM账号管理页面直接复用的性别展示组件默认标题兜底国际化复用已有 `pages.userBaseInfo.words.male`,未新增语言 key外部传入的 `genderName` 和接口返回性别名称保持原样优先展示
- 已完成验证:
- `src/components/data/Gender/index.vue` 中文残留扫描通过,当前无中文命中
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法检查通过
- 已执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过
- 说明:当前仍保留项目既有 `17` 条 warning未因本轮 `Gender` 国际化改动新增阻塞错误
- 已完成公共组件联动复查:
- `src/components/data/PropsSourceSelectPopover/index.vue`
- 说明:已完成抽奖配置奖品选择弹窗直接复用的道具资源选择 Popover 默认筛选 placeholder 与默认选择按钮文案国际化接口返回的资源名称、图片、SVGA 地址、筛选数据、属性映射与选择事件保持原样
- 已补充页面级语言 key
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 新增范围:`pages.propsSourceSelectPopover`
- 已完成验证:
- `src/components/data/PropsSourceSelectPopover/index.vue` 中文残留扫描通过,当前无中文命中
- 直接执行 `npm run build:prod` 在 Node 22 下触发 `ERR_OSSL_EVP_UNSUPPORTED`
- 已按文档备用方案执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过
- 说明:当前仍保留项目既有 `17` 条 warning未因本轮 `PropsSourceSelectPopover` 国际化改动新增阻塞错误
- 已完成公共组件联动复查:
- `src/components/data/PropsSourceSelectDrawer/index.vue`
- 说明:已完成砸金蛋配置页直接复用的道具资源选择抽屉标题、筛选 placeholder、悬浮选择提示和本地资源类型名称国际化本地资源类型名称复用 `pages.propsSourceGroupForm.resourceType`接口返回的资源名称、图片、SVGA 地址、资源数据、资源类型实际值、查询逻辑与选择事件保持原样
- 已补充页面级语言 key
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 新增范围:`pages.propsSourceSelectDrawer`
- 已完成验证:
- `src/components/data/PropsSourceSelectDrawer/index.vue` 中文残留扫描通过,当前无中文命中
- 直接执行 `npm run build:prod` 在 Node 22 下触发 `ERR_OSSL_EVP_UNSUPPORTED`
- 已按文档备用方案执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过
- 说明:当前仍保留项目既有 `17` 条 warning未因本轮 `PropsSourceSelectDrawer` 国际化改动新增阻塞错误
### 2026-04-27
- 已调整协作规则:
@ -131,15 +184,25 @@
- 已完成公共组件联动复查:
- `src/components/data/PropsRow/index.vue`
- 说明:已完成多个已完成主路由页面直接复用的 PropsRow 组件可见“永久”文本国际化;`item.remark`、数量、天数、道具类型、图片地址与接口返回资源数据保持原样
- 已完成公共组件联动复查:
- `src/components/data/RoomDeatilsDrawer/index.vue`
- 说明:已完成 Ludo飞行棋与房间资料列表等已完成页面直接复用的房间详情抽屉标题国际化保留现有文件名拼写和引用路径`roomId``RoomInfo` 子组件、关闭事件、基础信息回调与接口数据保持原样
- 已完成公共组件联动复查:
- `src/components/data/GiftSelect/index.vue`
- 说明:已完成活动管理页面直接复用的礼物选择组件国际化;礼物选择标题保留 `giftSize` 计数展示,搜索 placeholder 与悬浮选择提示已翻译,`sysOrigin`、礼物列表接口、筛选字段、接口返回礼物数据保持原样
- 已补充页面级语言 key
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 新增范围:`pages.propsRow.word.permanent`
- 新增范围:`pages.roomDetailsDrawer.dialog.title`
- 新增范围:`pages.giftSelect`
- 已完成验证:
- `src/components/data/PropsRow/index.vue` 中文残留扫描完成,剩余中文仅为注释“道具券 / 荣誉活动”,不属于可见展示文案
- `src/components/data/RoomDeatilsDrawer/index.vue` 中文残留扫描通过,当前无中文命中
- `src/components/data/GiftSelect/index.vue` 中文残留扫描通过,当前无中文命中
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- `npm run build:prod` 构建通过
- 说明:当前仍保留项目既有 `17` 条 warning未因本轮 `PropsRow` 国际化改动新增阻塞错误
- 说明:直接执行 `npm run build:prod` 在当前 Node 22 环境触发 `ERR_OSSL_EVP_UNSUPPORTED`;已按项目文档备用方案执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 并通过,当前仍保留项目既有 `17` 条 warning未因本轮 `GiftSelect` 国际化改动新增阻塞错误
- 已完成页面:
- `src/views/order/candy/running-water/index.vue`
@ -1304,10 +1367,23 @@
- 每个新完成页面必须同步检查直接涉及的页面内组件 / 私有组件 / 直接公共组件,并写明页面私有组件状态与直接公共组件状态
- 已完成主要路由页面需要补做直接公共组件联动复查,优先处理 `PropsRow``RoomDeatilsDrawer`、用户列表直接弹窗/抽屉等复用或高频组件
- 非主要路由页面后续不再继续扩展翻译
- 已完成公共组件联动复查:
- `src/components/data/AssociatedResources/index.vue`
- 说明:线程三已完成活动管理奖励编辑直接复用的关联资源组组件静态展示文本国际化;接口参数、路由路径、权限码、分页/查询/选择逻辑、上下架布尔值、接口返回资源组名称与奖品资源数据保持原样
- 已补充页面级语言 key
- `src/lang/messages/pages/en.js`
- `src/lang/messages/pages/zh.js`
- 新增范围:`pages.associatedResources`
- 已完成验证:
- `src/components/data/AssociatedResources/index.vue` 中文残留扫描通过
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 直接执行 `npm run build:prod` 因当前 Node 22 / webpack OpenSSL 兼容问题报 `ERR_OSSL_EVP_UNSUPPORTED`
- 按协作文档兜底执行 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过
- 说明:当前仍保留项目既有 `17` 条 warning未因本轮 `AssociatedResources` 国际化改动新增阻塞错误
- 当前认领线程:
- 线程一:待分配,当前未认领新任务;已完成 `src/components/data/PropsRow/index.vue` 公共组件联动复查、中文残留扫描、语言文件语法检查和构建验证
- 线程二:待分配,当前未认领新任务;已完成 `src/views/sys/menu-manager/index.vue``menu-tree.vue``menu-edit.vue` 系统管理 / 菜单管理页面国际化、中文残留扫描和构建验证
- 线程三:待分配,当前未认领新任务;已完成 `src/views/sys/role-manager/index.vue``edit-role.vue``authorize-role.vue` 系统管理 / 角色管理页面国际化、中文残留扫描和构建验证
- 线程一:待分配,当前未认领新任务;已完成 `src/components/IconsPanel/index.vue` 公共组件联动复查、中文残留扫描、语言文件语法检查、构建验证与 md 同步
- 线程二:待分配,当前未认领新任务;已完成 `src/components/data/PropsSourceSelectDrawer/index.vue` 公共组件联动复查、中文残留扫描和构建验证
- 线程三:待分配,当前未认领新任务;已完成 `src/components/data/AssociatedResources/index.vue` 公共组件联动复查、中文残留扫描和构建验证
## 扫描概况

View File

@ -1,6 +1,6 @@
<template>
<el-dialog
title="Icons面板"
:title="$t('pages.sysMenuManager.dialog.iconsPanelTitle')"
:visible="visible"
:modal-append-to-body="true"
:append-to-body="true"
@ -76,7 +76,7 @@ export default {
{ name: 'video', icon: 'video' },
{ name: 'flag', icon: 'flag' },
{ name: 'the_mall', icon: 'the_mall' },
//
// Color icons
{ name: 'android', icon: 'android' },
{ name: 'facebook', icon: 'facebook' },
{ name: 'google', icon: 'google' },

View File

@ -1,6 +1,6 @@
<template>
<el-drawer
title="关联资源组"
:title="$t('pages.associatedResources.dialog.title')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -14,13 +14,13 @@
<div class="filter-container">
<el-select
v-model="listQuery.shelfStatus"
placeholder="上/下架"
:placeholder="$t('pages.associatedResources.filter.shelfStatus')"
style="width: 15%"
class="filter-item"
clearable
@change="handleSearch"
>
<el-option v-for="item in showcaseTypes" :key="item.value" :label="item.name" :value="item.value" />
<el-option v-for="item in showcaseTypes" :key="String(item.value)" :label="$t(item.labelKey)" :value="item.value" />
</el-select>
<el-input
@ -33,7 +33,7 @@
/>
<el-input
v-model.trim="listQuery.name"
placeholder="类型名称"
:placeholder="$t('pages.associatedResources.filter.typeName')"
clearable
style="width: 30%"
class="filter-item"
@ -44,7 +44,7 @@
icon="el-icon-search"
@click="handleSearch"
>
搜索
{{ $t('pages.associatedResources.action.search') }}
</el-button>
</div>
@ -54,10 +54,10 @@
<div slot="header" class="clearfix">
<span>{{ rootItem.name }}
<el-tag v-if="rootItem.shelfStatus" size="mini" type="success">上架</el-tag>
<el-tag v-else size="mini" type="danger">下架</el-tag>
<el-tag v-if="rootItem.shelfStatus" size="mini" type="success">{{ $t('pages.associatedResources.word.onShelf') }}</el-tag>
<el-tag v-else size="mini" type="danger">{{ $t('pages.associatedResources.word.offShelf') }}</el-tag>
</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="clickSelected(rootItem)">确认选择 </el-button>
<el-button style="float: right; padding: 3px 0" type="text" @click="clickSelected(rootItem)">{{ $t('pages.associatedResources.action.confirmSelect') }}</el-button>
</div>
<div class="content">
<div class="source-list">
@ -135,8 +135,8 @@ export default {
return {
submitLoading: false,
showcaseTypes: [
{ value: false, name: '下架' },
{ value: true, name: '上架' }
{ value: false, labelKey: 'pages.associatedResources.word.offShelf' },
{ value: true, labelKey: 'pages.associatedResources.word.onShelf' }
],
thisRow: {},
thatSelectedUserId: {},

View File

@ -9,7 +9,7 @@ export default {
},
genderName: {
type: String,
default: ''
default: ''
},
desc: {
type: String,
@ -18,10 +18,13 @@ export default {
},
render(h, context) {
const { desc, gender, genderName } = context.props
const $t = context.parent && context.parent.$t
const defaultGenderName = $t ? $t('pages.userBaseInfo.words.male') : 'Male'
const displayGenderName = genderName || defaultGenderName
const vnodes = []
let descRes = ''
if (genderName) {
descRes += genderName + ' - '
if (displayGenderName) {
descRes += displayGenderName + ' - '
}
if (desc) {

View File

@ -1,7 +1,7 @@
<template>
<div class="gift-select">
<el-drawer
:title="'礼物选择('+giftSize+')'"
:title="$t('pages.giftSelect.dialog.title', { count: giftSize })"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -11,12 +11,12 @@
custom-class="drawer-auto-layout"
>
<div class="gift-content">
<el-input v-model="queryString" placeholder="请输入礼物ID/礼物名称/code" @input="inputQueryString" />
<el-input v-model="queryString" :placeholder="$t('pages.giftSelect.placeholder.keyword')" @input="inputQueryString" />
<div v-if="listLoading" v-loading="listLoading" style="margin-top: 24px;" />
<div class="gift-list flex-c flex-wrap">
<div v-for="(item, index) in list" :key="index" class="gift-item">
<div class="gift" @click="clickGift(item)">
<div class="tips">点击选择</div>
<div class="tips">{{ $t('pages.giftSelect.action.clickSelect') }}</div>
<img :src="item.giftPhoto">
</div>
<div class="gift-amount flex-c">

View File

@ -1,7 +1,7 @@
<template>
<div class="props-selected">
<el-drawer
title="选择道具"
:title="$t('pages.propsSourceSelectDrawer.dialog.title')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"
@ -15,18 +15,22 @@
<el-select
v-model="listQuery.propsType"
style="width: 30%"
placeholder="道具类型"
:placeholder="$t('pages.propsSourceSelectDrawer.placeholder.propsType')"
:disabled="disableAddContent"
@change="propsTypeChange"
>
<el-option
v-for="(item, index) in configPropsTypes"
:key="index"
:label="item.name"
:label="$t(item.nameKey)"
:value="item.propsType"
/>
</el-select>
<el-input v-model="listQuery.queryString" placeholder="道具名称/ID" style="width: 65%;" />
<el-input
v-model="listQuery.queryString"
:placeholder="$t('pages.propsSourceSelectDrawer.placeholder.propsNameOrId')"
style="width: 65%;"
/>
</div>
<div class="props-content">
<div v-if="listLoading" v-loading="listLoading" style="margin-top: 24px;" />
@ -39,7 +43,7 @@
/>
</div>
<div class="props" @click="clickPropsItem(item)">
<div class="tips">点击选择</div>
<div class="tips">{{ $t('pages.propsSourceSelectDrawer.action.clickSelect') }}</div>
<img :src="item.cover">
</div>
<div class="props-amount flex-c">
@ -78,18 +82,18 @@ export default {
queryString: ''
},
configPropsTypes: [
{ propsType: 'AVATAR_FRAME', name: '头像框', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'RIDE', name: '座驾', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'NOBLE_VIP', name: '贵族', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'THEME', name: '主题背景', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'GIFT', name: '礼物', loading: false, loadData: false, list: [], placeholder: '数量' },
{ propsType: 'BADGE', name: '用户徽章', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'ROOM_BADGE', name: '房间徽章', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'EMOJI', name: '表情包', loading: false, loadData: false, list: [], placeholder: '数量' },
{ propsType: 'CHAT_BUBBLE', name: '聊天气泡', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'FLOAT_PICTURE', name: '飘窗', loading: false, loadData: false, list: [], placeholder: '天' },
{ propsType: 'CUSTOMIZE', name: '自定义(只读)', loading: false, loadData: false, list: [], placeholder: '描述' },
{ propsType: 'FRAGMENTS', name: '碎片', loading: false, loadData: false, list: [], placeholder: '数量' }
{ propsType: 'AVATAR_FRAME', nameKey: 'pages.propsSourceGroupForm.resourceType.avatarFrame', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'RIDE', nameKey: 'pages.propsSourceGroupForm.resourceType.ride', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'NOBLE_VIP', nameKey: 'pages.propsSourceGroupForm.resourceType.nobleVip', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'THEME', nameKey: 'pages.propsSourceGroupForm.resourceType.theme', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'GIFT', nameKey: 'pages.propsSourceGroupForm.resourceType.gift', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.quantity' },
{ propsType: 'BADGE', nameKey: 'pages.propsSourceGroupForm.resourceType.userBadge', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'ROOM_BADGE', nameKey: 'pages.propsSourceGroupForm.resourceType.roomBadge', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'EMOJI', nameKey: 'pages.propsSourceGroupForm.resourceType.emoji', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.quantity' },
{ propsType: 'CHAT_BUBBLE', nameKey: 'pages.propsSourceGroupForm.resourceType.chatBubble', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'FLOAT_PICTURE', nameKey: 'pages.propsSourceGroupForm.resourceType.floatPicture', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.days' },
{ propsType: 'CUSTOMIZE', nameKey: 'pages.propsSourceGroupForm.resourceType.customizeReadonly', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.description' },
{ propsType: 'FRAGMENTS', nameKey: 'pages.propsSourceGroupForm.resourceType.fragments', loading: false, loadData: false, list: [], placeholderKey: 'pages.propsSourceSelectDrawer.unit.quantity' }
],
configPropsTypesMap: {},
disableAddContent: false,

View File

@ -6,7 +6,12 @@
trigger="click"
>
<div class="content flex-c flex-wrap">
<el-input v-if="showFilter" v-model="queryString" placeholder="请输入关键字进行过滤" style="margin-bottom: 10px;" />
<el-input
v-if="showFilter"
v-model="queryString"
:placeholder="$t('pages.propsSourceSelectPopover.placeholder.keyword')"
style="margin-bottom: 10px;"
/>
<div v-for="(item, index) in nativeData" :key="index" class="item" @click="clickItem(item)">
<div class="player">
<svgaplayer
@ -22,7 +27,7 @@
</div>
<el-button slot="reference" type="text">
<slot name="content">选择</slot>
<slot name="content">{{ $t('pages.propsSourceSelectPopover.action.select') }}</slot>
</el-button>
</el-popover>
</div>

View File

@ -1,7 +1,7 @@
<template>
<div class="user-details-drawer">
<el-drawer
title="房间资料详情"
:title="$t('pages.roomDetailsDrawer.dialog.title')"
:visible="true"
:before-close="handleClose"
:close-on-press-escape="false"

View File

@ -852,6 +852,17 @@ export default {
requestFailed: 'Request failed.'
}
},
giftSelect: {
dialog: {
title: 'Gift Selection ({count})'
},
placeholder: {
keyword: 'Enter gift ID, gift name, or code'
},
action: {
clickSelect: 'Click to Select'
}
},
giftHistoryDetailsDrawer: {
dialog: {
title: 'Details'
@ -1165,6 +1176,11 @@ export default {
selectCountry: 'Please select a country'
}
},
roomDetailsDrawer: {
dialog: {
title: 'Room Profile Details'
}
},
roomInfo: {
section: {
profileInfo: 'Basic Info',
@ -2304,6 +2320,23 @@ export default {
},
loading: 'Loading'
},
associatedResources: {
dialog: {
title: 'Associated Resource Groups'
},
filter: {
shelfStatus: 'Shelf Status',
typeName: 'Type Name'
},
action: {
search: 'Search',
confirmSelect: 'Select'
},
word: {
onShelf: 'On Shelf',
offShelf: 'Off Shelf'
}
},
redisTools: {
tags: {
checkInInfo: 'Check-In Info',
@ -2697,6 +2730,31 @@ export default {
permanent: 'Permanent'
}
},
propsSourceSelectPopover: {
placeholder: {
keyword: 'Enter keywords to filter'
},
action: {
select: 'Select'
}
},
propsSourceSelectDrawer: {
dialog: {
title: 'Select Props'
},
placeholder: {
propsType: 'Prop Type',
propsNameOrId: 'Prop Name / ID'
},
action: {
clickSelect: 'Click to Select'
},
unit: {
days: 'Days',
quantity: 'Quantity',
description: 'Description'
}
},
propsSourceGroupForm: {
dialog: {
title: '{action} ({sysOrigin})'
@ -3384,6 +3442,9 @@ export default {
normal: 'Normal',
disabled: 'Disabled'
},
dialog: {
iconsPanelTitle: 'Icons Panel'
},
event: {
addChild: 'Add child node to "{name}"',
updateNode: 'Edit "{name}" node',

View File

@ -851,6 +851,17 @@ export default {
requestFailed: '请求数据错误!'
}
},
giftSelect: {
dialog: {
title: '礼物选择({count}'
},
placeholder: {
keyword: '请输入礼物ID/礼物名称/code'
},
action: {
clickSelect: '点击选择'
}
},
giftHistoryDetailsDrawer: {
dialog: {
title: '详情'
@ -1164,6 +1175,11 @@ export default {
selectCountry: '请选择国家'
}
},
roomDetailsDrawer: {
dialog: {
title: '房间资料详情'
}
},
roomInfo: {
section: {
profileInfo: '基本资料',
@ -2303,6 +2319,23 @@ export default {
},
loading: '加载中'
},
associatedResources: {
dialog: {
title: '关联资源组'
},
filter: {
shelfStatus: '上/下架',
typeName: '类型名称'
},
action: {
search: '搜索',
confirmSelect: '确认选择'
},
word: {
onShelf: '上架',
offShelf: '下架'
}
},
redisTools: {
tags: {
checkInInfo: '打卡信息',
@ -2694,6 +2727,31 @@ export default {
permanent: '永久'
}
},
propsSourceSelectPopover: {
placeholder: {
keyword: '请输入关键字进行过滤'
},
action: {
select: '选择'
}
},
propsSourceSelectDrawer: {
dialog: {
title: '选择道具'
},
placeholder: {
propsType: '道具类型',
propsNameOrId: '道具名称/ID'
},
action: {
clickSelect: '点击选择'
},
unit: {
days: '天',
quantity: '数量',
description: '描述'
}
},
propsSourceGroupForm: {
dialog: {
title: '{action}{sysOrigin}'
@ -3381,6 +3439,9 @@ export default {
normal: '正常',
disabled: '禁用'
},
dialog: {
iconsPanelTitle: 'Icons面板'
},
event: {
addChild: '向“{name}”添加子节点',
updateNode: '修改“{name}”节点',