diff --git a/.cursor/ECX-8097-summary.md b/.cursor/ECX-8097-summary.md new file mode 100644 index 0000000..9ab1c14 --- /dev/null +++ b/.cursor/ECX-8097-summary.md @@ -0,0 +1,44 @@ +# ECX-8097 阿拉伯语 RTL 样式与数据展示修复 + +## 问题描述 +- 管理端在阿拉伯语下,商品销售分类列表、编辑/添加分类弹窗存在样式与展示异常 +- 表单标签与输入左对齐、数字框按钮在右侧、弹窗底部按钮顺序不符合 RTL 习惯 +- 表格操作列按钮与箭头方向不符合从右到左阅读习惯 +- 切换语言后弹窗内表单文案未随当前语言更新 + +## 修改内容 + +### 1. `src/styles/lang-ar.scss`(阿拉伯语 RTL 全局样式) + +**弹窗 (el-dialog)** +- 关闭按钮置于右侧(`right: 20px; left: auto`) +- 底部按钮区 `direction: rtl`、`text-align: right`,确定在右、取消在左 +- 底部按钮间距:`margin-right: 10px; margin-left: 0` + +**弹窗内表单 (sp-dialog)** +- RTL 下表单使用 `margin-left: 100px`、`margin-right: 0`,避免整体偏左 +- `el-form--label-right` 下表单项使用 flex + gap,保证标签与输入在 RTL 下对齐 + +**输入与数字框** +- `.el-input__inner`、`.el-textarea__inner` 增加 `text-align: right` +- `.el-input-number` 设置 `direction: rtl`,内部输入右对齐 +- `.el-input-number__decrease` / `__increase` 通过 `left: 1px; right: auto` 置于左侧 + +**表格** +- `.el-table__body-wrapper td .cell` 增加 `direction: rtl`,操作列按钮从右到左排列 + +**消息框 (el-message-box)** +- 关闭按钮置于右侧,与弹窗一致 + +(其余为既有 RTL 规则:设置路径/分类选择器、cascader、菜单、抽屉等) + +### 2. `src/view/goods/saleCategory.vue`(销售分类页) + +- 将 **categoryFormList** 从 `data` 改为 **computed**,使「分类名称」「排序」「上级分类」「分类图片」等标签与 placeholder 随当前语言(含阿拉伯语)响应式更新,切换语言后弹窗内文案正确。 + +## 影响范围 +- 仅当 `html[lang='ar-SA']` 或 `html[dir='rtl']` 时生效,其他语言无影响 +- 销售分类添加/编辑弹窗、所有使用 sp-dialog + el-form 的弹窗、表格操作列均受益于 RTL 样式 + +## 备注 +- 父分类名称(如「运动户外」)若仍显示为中文,需后端按语言返回分类名或前端做多语言映射,属数据/多语言方案,未在本单内实现。 diff --git a/.cursor/agents/i18n-agent.md b/.cursor/agents/i18n-agent.md new file mode 100644 index 0000000..02ba6bc --- /dev/null +++ b/.cursor/agents/i18n-agent.md @@ -0,0 +1,92 @@ +--- +name: i18n-agent +description: 根据给定的要翻译的目录任务(如 view/member),在 .cursor/skills/i18n-translate/plans 下找到对应 .md 计划文件,读取未翻译文件列表;若存在未翻译文件则调用 i18n-translate 技能执行翻译,翻译完成后将进度写回该 .md。若该目录下全部翻译完成,则更新 .cursor/todos/i18n_src_directory_todos.md 中的任务状态,并通知 @ i18n-supervisor 开始下一任务。 +--- + +你是项目的 **i18n 翻译执行智能体**。你的职责是:接收**目录任务** → 找到**对应计划 .md** → 读取**未翻译文件** → 若有则**调用 i18n-translate 技能**翻译 → **更新计划 .md 进度**;若该目录**全部翻译完成**,则**更新 todo 任务状态**并**通知 @ i18n-supervisor 开始下一任务**。 + +## 输入:目录任务 + +- 你会被给予一个**要翻译的目录**,例如:`view/member`、`view/mall`、`view/decorate`。 +- 该目录通常对应 `src/view/` 下的路径,如 `view/member` 即 `src/view/member`。任务中可能写 `view/member`、`view/member/` 或 `src/view/member`,均表示同一目录。 + +## 执行流程 + +### 1. 根据目录任务找到计划文件 + +- **计划文件目录**:`.cursor/skills/i18n-translate/plans/` +- **命名规则**:将目录路径中的 `/` 替换为 `_`,并加上 `src_` 前缀与 `.md` 后缀。 + - 例:`view/member` → `src_view_member.md` + - 例:`view/mall` → `src_view_mall.md` + - 例:`view/base` → `src_view_base.md` +- 若任务给的是 `src/view/member`,先转为目录标识 `view/member`,再得到 `src_view_member.md`。 +- **读取**该 .md 文件内容。 + +### 2. 判断是否存在未翻译文件 + +- 计划 .md 中通常包含: + - **未翻译完**:列表项为 `- \`相对路径\``(如 `- \`activity/add.vue\``) + - **已翻译**:同上格式,表示已完成 + - **无需翻译**:无需处理 +- 若 **「未翻译完」列表非空**,则存在需要翻译的文件;否则无需调用翻译,可直接结束并回复“该计划下暂无未翻译文件”。 + +### 3. 调用 i18n-translate 技能进行翻译 + +- **技能**:使用项目中的 **i18n-translate** 技能(见 `.cursor/skills/i18n-translate/SKILL.md`)。 +- **做法**:将本批**未翻译文件**(可从「未翻译完」中取一批,如 100~200 个)交给该技能执行翻译。技能会: + - 提取中文文案、用脚本生成 hash key、替换为 `$t('key')` / `this.$t('key')` + - 更新 `src/i18n/locales/zh-CN.json`、`en.json`、`ar.json` + - 按技能要求先查 `src/i18n/lang/index.json` 再写 en/ar +- 可多批执行,直到当前计划中的「未翻译完」列表清空或本轮目标完成。 + +### 4. 翻译完成后更新计划 .md 进度 + +- **每次有一批文件翻译完成后**,必须更新**同一计划文件**(如 `src_view_member.md`): + - 将本批已完成的文件从 **「未翻译完」** 列表中移除; + - 将本批已完成的文件加入 **「已翻译」** 列表; + - 若有统计表(如状态/数量/占比),按当前列表重新计算并更新。 + +### 5. 当该目录下全部翻译完成时 + +当对应计划 .md 中 **「未翻译完」列表已为空**(该目录下文件全部翻译完成)时,除更新计划 .md 外,还需: + +1. **更新任务状态** — 修改 `.cursor/todos/i18n_src_directory_todos.md`: + - 将当前目录对应的任务行由 `[in_progress]` 改为 `[completed]`; + - 若存在下一个任务(同一优先级内的下一行或下一批次),将其由 `[pending]` 改为 `[in_progress]`。 + - 任务与目录的对应关系以 todo 中每行描述的目录为准(如 `— view/member/` 对应 `view/member`)。 + +2. **通知 i18n-supervisor 开始下一任务** — 在本次回复中 **@ i18n-supervisor**(或 @ `.cursor/agents/i18n-supervisor.md`),明确说明当前目录已全部译完,请监督员启动下一任务。例如: + - 「当前目录 view/member 已全部翻译完成,已更新 todo 状态。@i18n-supervisor 请开始下一任务。」 + - 若 todo 中已无下一个待执行任务,可仅更新状态并说明「当前批次已全部完成,无下一任务」。 + +## 路径与文件约定 + +| 用途 | 路径 | +|----------------|------| +| 计划文件目录 | `.cursor/skills/i18n-translate/plans/` | +| 计划文件命名 | `src_` + 目录路径 `/` → `_` + `.md`(如 `src_view_member.md`) | +| 任务列表 | `.cursor/todos/i18n_src_directory_todos.md`(目录全部译完后更新状态) | +| 监督员 | `@.cursor/agents/i18n-supervisor.md`(目录全部译完后通知其开始下一任务) | +| 技能说明 | `.cursor/skills/i18n-translate/SKILL.md` | +| 语言包 | `src/i18n/locales/zh-CN.json`、`en.json`、`ar.json` | +| 翻译参考 | `src/i18n/lang/index.json`(技能内会使用) | + +## 与 i18n-translate 的关系 + +- **i18n-agent(你)**:负责任务调度与进度——读计划、取未翻译列表、决定批量和顺序、**调用 i18n-translate**、写回计划 .md。 +- **i18n-translate**:负责单文件/批量文件的具体翻译实现(扫描中文、生成 key、替换、写语言包、查 index.json)。不亲自做替换与写语言包时,应通过调用该技能完成。 + +## 回复结束时执行 Hook(会话内调起) + +- 在**每次对用户的回复结束前**,必须主动执行一次「继续翻译」Hook,以便在当前会话中达到“回复完后调起 hooks”的效果: + 1. **运行命令**:`node .cursor/hooks/continue-translate.js` + 2. **读取输出**:脚本会向 stdout 输出一行 JSON(包含 `action`、`message` 等)。 + 3. **纳入回复**:若输出中存在 `message` 字段,将该 `message` 作为本次回复末尾的**后续建议**原样或稍作归纳后呈现给用户(例如在回复最后加一句提示或建议下一步操作)。 +- 这样无需依赖 Cursor 的 stop 事件,在 i18n-agent 回复完成时即可在会话内触发与 `.cursor/hooks.json` 中 stop hook 相同的逻辑效果。 + +## 约束 + +- 仅当被用户或主会话**调用**时运行;不常驻、不监听文件系统。 +- 计划 .md 中的「未翻译完」「已翻译」等列表与统计必须与真实翻译结果一致,每批翻译后立即更新。 +- 若对应计划文件不存在,应明确提示“未找到目录 xxx 对应的计划文件(如 src_xxx.md)”,并结束。 +- **仅当该目录下全部翻译完成时**才修改 `i18n_src_directory_todos.md` 并 @ i18n-supervisor;进行中只更新计划 .md,不修改 todo。 diff --git a/.cursor/agents/i18n-supervisor.md b/.cursor/agents/i18n-supervisor.md new file mode 100644 index 0000000..c9754c8 --- /dev/null +++ b/.cursor/agents/i18n-supervisor.md @@ -0,0 +1,40 @@ +--- +name: i18n-supervisor +description: 监督 i18n 计划(i18n_src_directory_todos.md + plans/*.md)的执行。主要职责是监听并调用 i18n-agent。当 i18n-agent 完成某目录并通知本监督员时,由监督员启动下一任务(@ i18n-agent 执行下一目录);若发现 i18n-agent 已停止翻译,则主动 @ i18n-agent 继续。不亲自执行翻译。 +--- + +你是 **i18n 翻译进度监督员**。你**不负责翻译**,只负责**监督进度**、**在收到完成通知时启动下一任务**,以及在翻译停滞时**主动调用 i18n-agent** 继续工作。 + +## 核心职责 + +1. **响应完成通知** — 当 i18n-agent 完成某目录全部翻译并 @ 你时,根据 `.cursor/todos/i18n_src_directory_todos.md` 中的任务列表,将**下一任务**(下一个 `[pending]` 或已标为 `[in_progress]` 的批次)交给 i18n-agent 执行,即在回复中 **@ i18n-agent** 并明确指定下一目录,例如:「@i18n-agent 请执行 view/decorate 目录的翻译任务。」 +2. **监听进度** — 通过读取任务列表与对应计划 .md(`plans/src_*.md`),判断当前目录是否还有未翻译文件、i18n-agent 是否停滞。 +3. **在停滞时调用 i18n-agent** — 若当前任务为 `[in_progress]` 且对应计划中仍有「未翻译完」文件,却长时间无进度更新,则视为停滞,**主动 @ i18n-agent** 要求其继续当前目录的翻译。 +4. **不执行翻译** — 不提取文案、不替换 `$t()`、不修改语言包。所有翻译由 **i18n-agent** 完成。 + +## 使用的文件 + +| 用途 | 路径 | +|------------|------| +| 任务列表 | `.cursor/todos/i18n_src_directory_todos.md` | +| 计划进度 | `.cursor/skills/i18n-translate/plans/` 下对应 `src_<目录_路径>.md`(如 `src_view_member.md`) | + +- **任务列表**:每行一个任务,格式如 `- [in_progress] **batch-1-2** — view/member/`。状态为 `[pending]` / `[in_progress]` / `[completed]`。 +- **计划 .md**:与目录一一对应,内含「未翻译完」「已翻译」等列表,用于判断该目录是否还有未译文件。 + +## 被调用时的流程 + +1. **读取任务列表** — 打开 `i18n_src_directory_todos.md`,确认当前 `[in_progress]` 的任务及其目录(如 view/member)。 +2. **若因 i18n-agent 完成某目录而被 @** — 将该项任务标为已完成、将下一项标为进行中(若由 agent 已更新则仅确认),然后在回复中 **@ i18n-agent**,明确指定下一目录任务,例如:「@i18n-agent 请执行 view/decorate 目录的翻译任务。」若已无下一任务,则说明全部完成。 +3. **若为常规检查** — 根据当前 `[in_progress]` 的目录,找到对应计划文件(如 view/member → `plans/src_view_member.md`),查看「未翻译完」是否为空。若未空且长时间无更新,则 **@ i18n-agent** 继续当前目录;若已空则提醒更新 todo 并启动下一任务。 +4. **若计划已全部完成** — 简要汇报状态,无需再 @ i18n-agent。 + +## 与 i18n-agent 的关系 + +- **i18n-agent**:执行具体翻译(调用 i18n-translate)、更新计划 .md;某目录全部译完后更新 todo 并 **@ i18n-supervisor** 开始下一任务。 +- **你(i18n-supervisor)**:被 @ 时启动下一任务(@ i18n-agent + 下一目录);或主动检查进度,在停滞时 @ i18n-agent 继续。不亲自执行翻译。 + +## 限制 + +- 仅在被用户或 i18n-agent 在对话中**调用**时运行,无法在后台常驻或监听文件系统。 +- 只能通过「在回复中 @ i18n-agent」并指定目录来驱动翻译,不能代替 agent 执行翻译或直接改计划 .md 中的文件列表(进度由 i18n-agent 更新)。 diff --git a/.cursor/commands/openspec-apply.md b/.cursor/commands/openspec-apply.md new file mode 100644 index 0000000..99a9148 --- /dev/null +++ b/.cursor/commands/openspec-apply.md @@ -0,0 +1,23 @@ +--- +name: /openspec-apply +id: openspec-apply +category: OpenSpec +description: Implement an approved OpenSpec change and keep tasks in sync. +--- + +**Guardrails** +- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required. +- Keep changes tightly scoped to the requested outcome. +- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications. + +**Steps** +Track these steps as TODOs and complete them one by one. +1. Read `changes//proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria. +2. Work through tasks sequentially, keeping edits minimal and focused on the requested change. +3. Confirm completion before updating statuses—make sure every item in `tasks.md` is finished. +4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality. +5. Reference `openspec list` or `openspec show ` when additional context is required. + +**Reference** +- Use `openspec show --json --deltas-only` if you need additional context from the proposal while implementing. + diff --git a/.cursor/commands/openspec-archive.md b/.cursor/commands/openspec-archive.md new file mode 100644 index 0000000..492b3ed --- /dev/null +++ b/.cursor/commands/openspec-archive.md @@ -0,0 +1,27 @@ +--- +name: /openspec-archive +id: openspec-archive +category: OpenSpec +description: Archive a deployed OpenSpec change and update specs. +--- + +**Guardrails** +- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required. +- Keep changes tightly scoped to the requested outcome. +- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications. + +**Steps** +1. Determine the change ID to archive: + - If this prompt already includes a specific change ID (for example inside a `` block populated by slash-command arguments), use that value after trimming whitespace. + - If the conversation references a change loosely (for example by title or summary), run `openspec list` to surface likely IDs, share the relevant candidates, and confirm which one the user intends. + - Otherwise, review the conversation, run `openspec list`, and ask the user which change to archive; wait for a confirmed change ID before proceeding. + - If you still cannot identify a single change ID, stop and tell the user you cannot archive anything yet. +2. Validate the change ID by running `openspec list` (or `openspec show `) and stop if the change is missing, already archived, or otherwise not ready to archive. +3. Run `openspec archive --yes` so the CLI moves the change and applies spec updates without prompts (use `--skip-specs` only for tooling-only work). +4. Review the command output to confirm the target specs were updated and the change landed in `changes/archive/`. +5. Validate with `openspec validate --strict` and inspect with `openspec show ` if anything looks off. + +**Reference** +- Use `openspec list` to confirm change IDs before archiving. +- Inspect refreshed specs with `openspec list --specs` and address any validation issues before handing off. + diff --git a/.cursor/commands/openspec-proposal.md b/.cursor/commands/openspec-proposal.md new file mode 100644 index 0000000..2d7ed7e --- /dev/null +++ b/.cursor/commands/openspec-proposal.md @@ -0,0 +1,27 @@ +--- +name: /openspec-proposal +id: openspec-proposal +category: OpenSpec +description: Scaffold a new OpenSpec change and validate strictly. +--- + +**Guardrails** +- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required. +- Keep changes tightly scoped to the requested outcome. +- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications. +- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files. + +**Steps** +1. Review `openspec/project.md`, run `openspec list` and `openspec list --specs`, and inspect related code or docs (e.g., via `rg`/`ls`) to ground the proposal in current behaviour; note any gaps that require clarification. +2. Choose a unique verb-led `change-id` and scaffold `proposal.md`, `tasks.md`, and `design.md` (when needed) under `openspec/changes//`. +3. Map the change into concrete capabilities or requirements, breaking multi-scope efforts into distinct spec deltas with clear relationships and sequencing. +4. Capture architectural reasoning in `design.md` when the solution spans multiple systems, introduces new patterns, or demands trade-off discussion before committing to specs. +5. Draft spec deltas in `changes//specs//spec.md` (one folder per capability) using `## ADDED|MODIFIED|REMOVED Requirements` with at least one `#### Scenario:` per requirement and cross-reference related capabilities when relevant. +6. Draft `tasks.md` as an ordered list of small, verifiable work items that deliver user-visible progress, include validation (tests, tooling), and highlight dependencies or parallelizable work. +7. Validate with `openspec validate --strict` and resolve every issue before sharing the proposal. + +**Reference** +- Use `openspec show --json --deltas-only` or `openspec show --type spec` to inspect details when validation fails. +- Search existing requirements with `rg -n "Requirement:|Scenario:" openspec/specs` before writing new ones. +- Explore the codebase with `rg `, `ls`, or direct file reads so proposals align with current implementation realities. + diff --git a/.cursor/commit-summary/2026-03-06-ECX-8057.md b/.cursor/commit-summary/2026-03-06-ECX-8057.md new file mode 100644 index 0000000..18e91c0 --- /dev/null +++ b/.cursor/commit-summary/2026-03-06-ECX-8057.md @@ -0,0 +1,12 @@ +## 本次变更总结 + +**时间**: 2026-03-06 +**TB**: ECX-8057 + +**涉及文件**: +- src/components/sp-form/index.vue (修改) + +**主要改动**: +- **sp-form**:`.flex` 样式类微调,`align-items` 由 `center` 改为 `flex-start`,并增加 `gap: 10px`,表单项纵向对齐与间距更适配弹窗表单。 + +**一句话概括**: style: 表单项 flex 布局对齐与间距微调 (ECX-8057) diff --git a/.cursor/commit-summary/2026-03-06-summary.md b/.cursor/commit-summary/2026-03-06-summary.md new file mode 100644 index 0000000..32d71ca --- /dev/null +++ b/.cursor/commit-summary/2026-03-06-summary.md @@ -0,0 +1,11 @@ +## 本次变更总结 + +**时间**: 2026-03-06 + +**涉及文件**: +- src/view/decorate/wgts/wgt_fullSlider/sliderDialog.vue (修改) + +**主要改动**: +- **全屏轮播挂件弹窗**:与 wgt_slider 一致,表单项统一增加 `flex: true`(媒体类型、视频/图片地址、自动播放、离场视频交互、蒙层及蒙层宽高与位置、更多链接等),使用 flex 布局展示。 + +**一句话概括**: feat: 全屏轮播挂件弹窗表单项改用 flex 布局 diff --git a/.cursor/commit-summary/2026-03-09-ECX-8039.md b/.cursor/commit-summary/2026-03-09-ECX-8039.md new file mode 100644 index 0000000..78ded62 --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8039.md @@ -0,0 +1,14 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**需求单号**: ECX-8039 + +**涉及文件**: +- src/components/sp-picker/pickers/picker-coupon.vue (修改) + +**主要改动**: +- 优惠券选择器与列表页一致:增加「创建店铺」「适用店铺」两列,展示逻辑与 coupon.vue 一致(创建店铺:source_id≤0 或无名称显示平台,否则显示 source_name/store_name/shop_name;适用店铺:use_all_shops==1 显示全部店铺,否则显示指定店铺);原单列「店铺」(source_name) 已移除。 +- i18n:config.title 由硬编码「选择优惠券」改为 i18n key 7039e9c5.45bcee,与 created() 中 $t 一致。 + +**一句话概括**: feat: 优惠券选择器增加创建店铺/适用店铺列并做 i18n (ECX-8039) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8064.md b/.cursor/commit-summary/2026-03-09-ECX-8064.md new file mode 100644 index 0000000..b3d747a --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8064.md @@ -0,0 +1,16 @@ +## 本次变更总结 + +**时间**: 2026-03-09 +**TB**: ECX-8064 + +**涉及文件**: +- src/i18n/locales/zh-CN.json (修改) +- src/i18n/locales/en.json (修改) +- src/i18n/locales/ar.json (修改) + +**主要改动**: +- i18n:补全普通订单列表导出成功提示的翻译 key。 + - 在 zh-CN、en、ar 中新增 `c95ea121.3e1ddd`,对应「已加入执行队列,请在设置-导出列表中下载」及英/阿译文。 + - 用于 `src/view/mall/trade/normalorders/list.vue` 中导出成功提示,修复该 key 未翻译的问题。 + +**一句话概括**: i18n: 补全 c95ea121.3e1ddd 翻译 (ECX-8064) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8068.md b/.cursor/commit-summary/2026-03-09-ECX-8068.md new file mode 100644 index 0000000..8b35b4a --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8068.md @@ -0,0 +1,18 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**需求单号**: ECX-8068 + +**涉及文件**: +- src/view/member/members/tags.vue (修改) +- src/view/member/members/comps/CompAddTag.vue (新增) +- src/view/member/members/comps/CompTagList.vue (新增) + +**主要改动**: +- 会员标签页由「单标签」管理改为「标签组」管理:列表改为调用 `/member/tag-group` 接口,使用 SpFinder 展示标签组列表,搜索区改为 SpFormPlus + keyword 关键词。 +- 抽离新建/编辑弹窗为子组件 CompAddTag:支持标签组名称、多标签(名称/背景色/字体色)、校验(组名必填且≤15 字、至少一个标签)、编辑时删除标签(deleteids),通过 submit/close 与父页联动。 +- 新增 CompTagList:标签列表展示与可选「添加」输入、可选选中态,供列表列或其它场景复用。 +- tags.vue 精简:移除原 el-table/分页及内联添加编辑弹窗,删除大量注释代码,主流程为搜索 → 新建标签组 → Finder 列表展示与操作。 + +**一句话概括**: feat: 会员标签页改为标签组管理,抽离 CompAddTag/CompTagList (ECX-8068) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8069.md b/.cursor/commit-summary/2026-03-09-ECX-8069.md new file mode 100644 index 0000000..7715f0a --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8069.md @@ -0,0 +1,14 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**需求单号**: ECX-8069 + +**涉及文件**: +- src/layout/basic/layout-sidebar.vue (修改) + +**主要改动**: +- 三级菜单-多开保持:路由切换时不再调用会关闭其他二级菜单的 `openSubMenu`,改为新增 `ensureSubMenuOpen(menuToOpen)`,仅确保当前路由所在父级二级菜单展开,不折叠其他已展开的二级菜单;`updateMenuState()` 改为调用 `ensureSubMenuOpen`,解决「展开两个二级菜单后点击任意三级菜单会导致另一个二级被收起」的问题。 +- 当前路由父级不收起:二级菜单 title 插槽内增加 `@click="handleSubmenuTitleClick(...)"`,当前路由所在父级且已展开时 `preventDefault`/`stopPropagation`,避免点击标题收起;`handleMenuClose` 中若被关闭项为当前路由父级则直接 return,不将其从 `openedMenus` 移除。 + +**一句话概括**: fix: 三级菜单支持多开且当前路由父级不自动收起 (ECX-8069) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8070.md b/.cursor/commit-summary/2026-03-09-ECX-8070.md new file mode 100644 index 0000000..a4bd2f8 --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8070.md @@ -0,0 +1,16 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**需求单号**: ECX-8070 + +**涉及文件**: +- src/components/sp-form/index.vue (修改) +- src/view/decorate/wgts/wgt_fullSlider/sliderDialog.vue (修改) +- src/view/decorate/wgts/wgt_slider/sliderDialog.vue (修改) + +**主要改动**: +- sp-form:移除表单项的 flex 布局支持(删除 .flex 样式及 form-item 的 flex class 绑定);表单项支持按项设置 labelWidth(item.labelWidth 或组件 labelWidth)。 +- 装修轮播/全屏轮播:两个 sliderDialog 的 SpForm 增加 label-position="left";表单配置中移除或清空各表单项的 flex: true,改为依赖 label 左对齐布局。 + +**一句话概括**: refactor: 表单移除 flex 布局,装修轮播弹窗改为 label 左对齐 (ECX-8070) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8079.md b/.cursor/commit-summary/2026-03-09-ECX-8079.md new file mode 100644 index 0000000..277f3f2 --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8079.md @@ -0,0 +1,18 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**需求单号**: ECX-8079 + +**涉及文件**: +- src/i18n/locales/zh-CN.json (修改) +- src/i18n/locales/en.json (修改) +- src/i18n/locales/ar.json (修改) +- src/view/mall/pointsmalltrade/shipping/add.vue (修改) + +**主要改动**: +- i18n 重复 key 修复:zh-CN.json 中 `d41d8cd9.e5f6g7` 曾出现两次,分别对应「已加入执行队列,请在设置-导出列表中下载」与「卖家承担运费」,后者覆盖前者导致自营商品导出成功时误提示「卖家承担运费」。 +- 为「卖家承担运费」新增独立 key `d41d8cd9.f8g9h0`,在 zh-CN / en / ar 三语中均增加该 key;`d41d8cd9.e5f6g7` 仅保留导出队列提示文案及对应英/阿翻译。 +- 积分商城运费模板页 pointsmalltrade/shipping/add.vue:两处「卖家承担运费」由 `$t('d41d8cd9.e5f6g7')` 改为 `$t('d41d8cd9.f8g9h0')`。 + +**一句话概括**: fix: 修复 d41d8cd9.e5f6g7 重复 key,导出成功提示与卖家承担运费分离 (ECX-8079) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8086.md b/.cursor/commit-summary/2026-03-09-ECX-8086.md new file mode 100644 index 0000000..dd43642 --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8086.md @@ -0,0 +1,13 @@ +## 本次变更总结 + +**时间**: 2026-03-09 +**TB**: ECX-8086 + +**涉及文件**: +- src/view/decorate/index.vue (修改) + +**主要改动**: +- 装修:店铺装修(scene=1003) 也展示「页面设置」挂件。 + - 将 headerVisible 从仅 1001 展示改为 1001、1003 均展示页面设置,1007 分类模版等仍不展示。 + +**一句话概括**: feat(decorate): 店铺装修 scene=1003 支持页面设置 (ECX-8086) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8088.md b/.cursor/commit-summary/2026-03-09-ECX-8088.md new file mode 100644 index 0000000..b9a8b8c --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8088.md @@ -0,0 +1,20 @@ +## 本次变更总结 + +**时间**: 2026-03-09 +**TB**: ECX-8088 + +**涉及文件**: +- src/components/sp-picker/pickers/picker-regactivity.vue (修改) +- src/i18n/locales/zh-CN.json (修改) +- src/i18n/locales/en.json (修改) +- src/i18n/locales/ar.json (修改) + +**主要改动**: +- 活动报名挂件(picker-regactivity): + - 接口由 `easylist` 改为 `list`(/selfhelp/registrationActivity/list)。 + - 列表新增「活动状态」列(status_name),并做 i18n(key ffeca7a9.1181a5)。 + - 弹窗标题改为通过 config 的 key 在 created 中解析,去掉硬编码中文。 + - 模板名称列注释隐藏;beforeSearch 中 is_valid 参数注释掉。 +- i18n:zh-CN/en/ar 新增「活动状态」文案(ffeca7a9.1181a5)。 + +**一句话概括**: feat(picker): 活动报名挂件改 list 接口、加状态列并 i18n (ECX-8088) diff --git a/.cursor/commit-summary/2026-03-09-ECX-8089.md b/.cursor/commit-summary/2026-03-09-ECX-8089.md new file mode 100644 index 0000000..a30613d --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-ECX-8089.md @@ -0,0 +1,15 @@ +## 本次变更总结 + +**时间**: 2026-03-09 +**TB**: ECX-8089 + +**涉及文件**: +- src/i18n/locales/zh-CN.json (修改) +- src/i18n/locales/en.json (修改) +- src/i18n/locales/ar.json (修改) + +**主要改动**: +- i18n:模版装修「设置路径」弹窗中,将「秒杀」改为「限时特惠」。 + - 文案 key:d81d8932.55c758。zh-CN 改为「限时特惠」,en 改为「Limited-time offer」,ar 改为「عرض محدود الوقت」。仅展示文案调整,逻辑与接口未改。 + +**一句话概括**: i18n: 设置路径弹窗「秒杀」改为「限时特惠」(ECX-8089) diff --git a/.cursor/commit-summary/2026-03-09-decorate-wgt-id.md b/.cursor/commit-summary/2026-03-09-decorate-wgt-id.md new file mode 100644 index 0000000..30bf07a --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-decorate-wgt-id.md @@ -0,0 +1,25 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**涉及文件**: +- src/view/decorate/wgts/wgt_classify/config.js (修改) +- src/view/decorate/wgts/wgt_contentPartition/config.js (修改) +- src/view/decorate/wgts/wgt_coupon/config.js (修改) +- src/view/decorate/wgts/wgt_goods/config.js (修改) +- src/view/decorate/wgts/wgt_group/config.js (修改) +- src/view/decorate/wgts/wgt_hotranking/config.js (修改) +- src/view/decorate/wgts/wgt_hotzone/config.js (修改) +- src/view/decorate/wgts/wgt_locationModule/config.js (修改) +- src/view/decorate/wgts/wgt_ranking/config.js (修改) +- src/view/decorate/wgts/wgt_shop/config.js (修改) +- src/view/decorate/wgts/wgt_speedkill/config.js (修改) +- src/view/decorate/wgts/wgt_store-alphabet/config.js (修改) + +**主要改动**: +- 装修挂件(decorate/wgts):在 12 个 wgt 的 config.js 中,为 transformIn 与 transformOut 统一补全 id 透传。 + - transformIn:在返回对象中增加 `id: v?.id`,保证入参 id 带入组件内部。 + - transformOut:在 pickBy 映射中增加 `id: 'id'`,保证保存/上报数据带 id。 +- 涉及 wgt:contentPartition、locationModule、classify、coupon、goods、group、hotranking、hotzone、ranking、speedkill、store-alphabet、shop。 + +**一句话概括**: feat(decorate): 装修挂件 transformIn/transformOut 统一透传 id diff --git a/.cursor/commit-summary/2026-03-09-rich-text-picker-fix.md b/.cursor/commit-summary/2026-03-09-rich-text-picker-fix.md new file mode 100644 index 0000000..3e96403 --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-rich-text-picker-fix.md @@ -0,0 +1,13 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**涉及文件**: +- src/components/sp-rich-text/index.vue (修改) + +**主要改动**: +- 富文本(SpRichText)图片上传:修复点击上传按钮报错 `Cannot read properties of undefined (reading 'abstract')`。 + - 原因:uploader 模块内使用 `Vue.prototype.$picker.image()`,getter 的 this 为 Vue.prototype,导致 picker 弹窗的 parent 非有效组件实例,Vue initLifecycle 读 parent.$options.abstract 时报错。 + - 修改:改为使用 `this.$root.$picker.image()`,从当前组件树的根实例取 $picker,保证 parent 为合法 Vue 实例。 + +**一句话概括**: fix: 富文本图片上传改用 $root.$picker 修复 initLifecycle 报错 diff --git a/.cursor/commit-summary/2026-03-09-summary.md b/.cursor/commit-summary/2026-03-09-summary.md new file mode 100644 index 0000000..ce04bd2 --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-summary.md @@ -0,0 +1,13 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**涉及范围**: +- ESLint --fix 自动修复(约 421 个 .vue/.js 文件) +- 会员标签页及子组件 i18n(tags.vue、CompAddTag.vue、CompTagList.vue + zh-CN/en/ar) + +**主要改动**: +- **ESLint 自动修复**:对 src 执行 `eslint --ext .js,.jsx,.vue --fix`,批量修复 vue/html-self-closing 等可自动修复规则(如 void 元素 ``→``、非 void 元素自闭合等),涉及 components、view、views、layout 等大量文件。 +- **会员标签 i18n**:tags.vue 搜索/按钮/列名/确认与消息文案改为 $t(),searchFormItems 改为 computed;CompAddTag.vue 弹窗标题、表单项、校验文案、按钮改为 $t();CompTagList.vue 占位符与「+ 添加」改为 $t()。zh-CN/en/ar 新增 ec391ebb.*、a2bf2d04.*、45a63912.* 等 key。 + +**一句话概括**: chore: ESLint --fix 批量修复 + 会员标签页及 CompAddTag/CompTagList i18n diff --git a/.cursor/commit-summary/2026-03-09-video-whitelist.md b/.cursor/commit-summary/2026-03-09-video-whitelist.md new file mode 100644 index 0000000..02f195c --- /dev/null +++ b/.cursor/commit-summary/2026-03-09-video-whitelist.md @@ -0,0 +1,16 @@ +## 本次变更总结 + +**时间**: 2026-03-09 + +**涉及文件**: +- src/components/sp-video-picker/index.vue (修改) +- src/view/mall/marketing/storewhitelist.vue (修改) + +**主要改动**: +- **富文本/商品视频**:SpVideoPicker 上传视频后支持删除。 + - 删除图标改为 el-icon-circle-close,补充样式与 hover,并 stopPropagation 避免误触;移除 render 中的 console.log。 +- **店铺白名单**:导出与列表勾选。 + - 选择列移至表格第一列并设宽,保证勾选框可见;tableList 初始为 [],selectMobile 初始为 []。 + - 导出逻辑:有勾选时传 search_mobile 导出选中项,无勾选时按当前筛选条件导出全部,不再提示「请选择数据」;去掉导出处的 console.log。 + +**一句话概括**: fix: 商品视频可删除 + 店铺白名单勾选列与导出逻辑优化 diff --git a/.cursor/commit-summary/2026-04-02-invoice-i18n-keys.md b/.cursor/commit-summary/2026-04-02-invoice-i18n-keys.md new file mode 100644 index 0000000..31ee3de --- /dev/null +++ b/.cursor/commit-summary/2026-04-02-invoice-i18n-keys.md @@ -0,0 +1,20 @@ +## 本次变更总结 + +**时间**: 2026-04-02 + +**涉及文件**: +- `src/view/financial/invoice/constants.js`(修改) +- `src/view/financial/invoice/list.vue`(修改) +- `src/view/financial/invoice/listSchema.js`(修改) +- `src/view/financial/invoice/invoiceTax.vue`(修改) +- `src/view/financial/invoice/information.vue`(修改) +- `src/view/applications/pointmall/orderList.vue`(修改) + +**主要改动**: +- 发票 `constants`:列表项由 `label`/`title` 存 i18n key 改为统一字段 **`i18nKey`**,并补充注释说明须通过 `$t` 展示。 +- 发票列表页:用计算属性 **`invoiceStatusTabItems`**、**`invoiceSourceOptions`** 生成已翻译的 `label`;`typeList` 统一为 `label` 字段。 +- 发票 `listSchema` 弹窗选项改为 `vm.$t(item.i18nKey)`,移除未使用的 `invoice_source_arr` 导入。 +- `invoiceTax.vue` / `information.vue`:删除未使用的 `status` 引用。 +- 积分商城 `orderList.vue`:开票状态下拉 `:label="$t(item.i18nKey)"`;表格列用 **`invoiceStatusText`** 经 `$t` 展示状态文案(修复此前直接输出 key 的问题)。 + +**一句话概括**: 发票开票状态枚举改为 i18nKey,列表/弹窗/积分订单列表统一用 $t 展示文案 diff --git a/.cursor/commit-summary/2026-04-02-order-detail-supplier-section.md b/.cursor/commit-summary/2026-04-02-order-detail-supplier-section.md new file mode 100644 index 0000000..bf3697a --- /dev/null +++ b/.cursor/commit-summary/2026-04-02-order-detail-supplier-section.md @@ -0,0 +1,11 @@ +## 本次变更总结 + +**时间**: 2026-04-02 + +**涉及文件**: +- `src/view/mall/trade/order/detail/index.vue`(修改) + +**主要改动**: +- 订单详情页某卡片区块(含表头 `3cdfcea1.954493` 与下方 `card-panel`)去掉 **`v-if="!IS_SUPPLIER()"`**,供应商端登录时也会展示该区块(此前仅非供应商可见)。 + +**一句话概括**: 订单详情:供应商端展示原隐藏的卡片区块 diff --git a/.cursor/commit-summary/2026-04-02-saleCategory-platform-hide.md b/.cursor/commit-summary/2026-04-02-saleCategory-platform-hide.md new file mode 100644 index 0000000..d0ad76a --- /dev/null +++ b/.cursor/commit-summary/2026-04-02-saleCategory-platform-hide.md @@ -0,0 +1,13 @@ +## 本次变更总结 + +**时间**: 2026-04-02 + +**涉及文件**: +- `src/view/goods/saleCategory.vue` (修改) + +**主要改动**: +- 销售分类页:在 **PLATFORM 版本**(`VERSION_PLATFORM()` 为真)下隐藏「前端是否展示」总开关、表格「前台是否显示」列,以及弹窗内对应表单项。 +- `mounted` 中仅在非 PLATFORM 时调用 `fetchSaleableFilter()`,避免多余接口请求。 +- 去掉未使用的 `@/utils` 导入(展示控制仍使用原型上的 `VERSION_PLATFORM()` 等)。 + +**一句话概括**: 销售分类:PLATFORM 版本隐藏前端展示相关开关与列 diff --git a/.cursor/commit-summary/commit-convention.md b/.cursor/commit-summary/commit-convention.md new file mode 100644 index 0000000..9e1309c --- /dev/null +++ b/.cursor/commit-summary/commit-convention.md @@ -0,0 +1,24 @@ +# Commit 约定(可选) + +本文件可选。若存在,生成 commit message 时会参考以下约定。 + +## 前缀 + +- `feat:` 新功能 +- `fix:` 修复 +- `refactor:` 重构(不改变行为) +- `i18n:` 国际化/文案 +- `style:` 样式、格式(非逻辑) +- `chore:` 构建、配置、杂项 +- `docs:` 文档 + +## 格式 + +- 标题首行 ≤ 50 字,使用祈使句(如「添加 xxx」而非「添加了 xxx」)。 +- 需要时在 body 中列出主要改动点。 + +## 示例 + +``` +feat: 装修挂件 wgtName 改为 i18n.t() 并补全导入 +``` diff --git a/.cursor/commit-summary/last-summary.md b/.cursor/commit-summary/last-summary.md new file mode 100644 index 0000000..7520921 --- /dev/null +++ b/.cursor/commit-summary/last-summary.md @@ -0,0 +1,7 @@ +## 最近一次变更 + +**时间**: 2026-04-02 + +**文件**: `src/view/mall/trade/order/detail/index.vue` + +**简述**: 移除订单详情中某 el-card 表头与面板的 `!IS_SUPPLIER()` 条件,供应商账号也可看到该区块。 diff --git a/.cursor/hooks.json b/.cursor/hooks.json new file mode 100644 index 0000000..c1fa0a7 --- /dev/null +++ b/.cursor/hooks.json @@ -0,0 +1,11 @@ +{ + "version": 1, + "hooks": { + // "stop": [ + // { + // "command": "node .cursor/hooks/continue-translate.js", + // "loop_limit": 30 + // } + // ] + } +} diff --git a/.cursor/hooks/continue-translate.js b/.cursor/hooks/continue-translate.js new file mode 100644 index 0000000..de74dfd --- /dev/null +++ b/.cursor/hooks/continue-translate.js @@ -0,0 +1,26 @@ +// .cursor/hooks/continue-translate.js +// 作为 Cursor stop hook 运行时:从 stdin 读入 stop 的 input,向 stdout 输出 { followup_message } 后 Cursor 会自动把该消息作为下一条用户消息提交,继续会话。 + +const fs = require('fs') + +function main() { + let input = { status: 'completed', loop_count: 0 } + try { + const raw = fs.readFileSync(0, 'utf-8') + if (raw && raw.trim()) { + input = JSON.parse(raw) + } + } catch (e) { + // 非 hook 调用时 stdin 可能为空,忽略 + } + + // Cursor stop hook 约定:输出 { "followup_message": "..." } 时,会自动将该内容作为下一条用户消息提交,继续会话 + const response = { + followup_message: '请继续翻译。' + } + + console.log(JSON.stringify(response)) + process.exit(0) +} + +main() diff --git a/.cursor/skills/commit-summary/SKILL.md b/.cursor/skills/commit-summary/SKILL.md new file mode 100644 index 0000000..898795d --- /dev/null +++ b/.cursor/skills/commit-summary/SKILL.md @@ -0,0 +1,95 @@ +--- +name: commit-summary +description: Summarize current code changes and optionally commit. Use when the user asks to summarize what changed, record changes, commit with a message, or "总结这次改了什么并提交"/"帮我 commit". +--- + +# 变更总结与提交 (Commit Summary) + +在用户提出「总结这次改了什么」「记录一下变更」「帮我提交」等请求时,按本流程执行:先查看变更、写出总结、可选地执行 commit。 + +## 何时触发 + +- 用户说:总结这次改了什么、记录变更、帮我提交、直接 commit、总结并提交 +- 用户说:我改完了,帮我写 commit message 并提交 + +## 流程 + +### 1) 获取变更范围 + +在项目根目录执行: + +```bash +git status -sb +git diff --stat +git diff +``` + +若存在已暂存内容,再执行 `git diff --cached` 查看 staged 变更。根据 `git status` 决定总结的是「未暂存」还是「已暂存」的变更。 + +### 2) 写出总结(中文) + +按下面结构写一段**本次变更总结**,并**生成新的总结文档**(不覆盖旧文档): + +**文档命名**:`YYYY-MM-DD-{tb号}.md`,保存到 `.cursor/commit-summary/` 目录。 +- 示例:`2026-03-06-ECX-8058.md` +- 若用户当次对话中提供了 Teambition/需求单号(如 ECX-xxxx),则用该 tb 号作为文件名后半部分。 +- 若未提供 tb 号,则使用 `YYYY-MM-DD-summary.md`,或根据「一句话概括」生成简短英文标识(如 `coupon-list-i18n`)。 + +**总结文档结构**: + +```markdown +## 本次变更总结 + +**时间**: YYYY-MM-DD + +**涉及文件**: +- 路径1 (新增/修改/删除) +- 路径2 (修改) +- ... + +**主要改动**: +- 模块/功能1:简要说明 +- 模块/功能2:简要说明 +- ... + +**一句话概括**: (用作 commit message 的简短描述) +``` + +- 总结要基于实际 diff,不要编造。 +- 若用户有特殊要求(如按「功能/修复/文档」分类),按用户要求组织。 +- 每次总结都写入**新文件**,便于按日期和 tb 号追溯;可同时更新 `last-summary.md` 为本次内容(便于「最近一次」查看)。 + +### 3) 是否执行提交 + +- **仅总结、不提交**:用户只说「总结」「记录」时,只输出总结并(可选)写入 `last-summary.md`,不执行 `git add` / `git commit`。可追问:「需要我帮你直接提交吗?」 +- **总结并提交**:用户明确说「并提交」「直接 commit」「帮我 commit」时,继续执行步骤 4。 + +### 4) 执行提交(仅在用户要求提交时) + +1. **暂存**: + - 若用户未指定文件:`git add -A` 或 `git add .`(按项目习惯)。 + - 若用户指定了文件或目录:只 `git add` 指定路径。 +2. **Commit message**: + - 使用总结里的「一句话概括」作为 commit 标题(首行 ≤50 字)。 + - 若变更较多,可在 commit body 中粘贴「主要改动」列表(`git commit -m "标题" -m "正文"` 或多行 -m)。 +3. **执行**: + `git commit -m "..."`(或带 -m body),在项目根目录执行。 +4. **确认**:提交成功后,简短回复「已提交」并附上本次总结的要点或 commit hash。 + +## Commit Message 约定(可选) + +- 首行:简短说明,不超过 50 字。 +- 可选用前缀:`feat:`, `fix:`, `refactor:`, `i18n:`, `chore:` 等,若项目已有规范则遵循项目规范。 +- 若项目根目录有 `.cursor/commit-summary/commit-convention.md`,优先按该文件约定生成 message。 + +## 注意事项 + +- 不执行 `git push`,除非用户明确说「并 push」或「提交并推送」。 +- 提交前若发现存在未跟踪的敏感文件(如 .env、密钥),在总结中提醒用户,并避免将其加入暂存。 +- 所有 git 命令在**项目根目录**(即 git 仓库根目录)执行。 + +## 示例对话 + +- 用户:「帮我总结这次改了什么并提交」→ 获取 diff → 写总结 → **新建** `.cursor/commit-summary/YYYY-MM-DD-{tb号}.md`(无 tb 号则用 `YYYY-MM-DD-summary.md`)→ 可选更新 last-summary.md → git add → git commit。 +- 用户:「先总结一下我改了啥」→ 只执行获取 diff 与写总结,并生成新的日期+tb号总结文档,不 commit,可问「需要我帮你直接提交吗?」。 +- 用户:「记录一下然后 commit」→ 写总结、生成新总结文档并执行 commit。 diff --git a/.cursor/skills/i18n-translate/SKILL.md b/.cursor/skills/i18n-translate/SKILL.md new file mode 100644 index 0000000..97280f3 --- /dev/null +++ b/.cursor/skills/i18n-translate/SKILL.md @@ -0,0 +1,171 @@ +--- +name: i18n-translate +description: Translate Chinese UI strings in this repo into i18n keys with a hash-based key scheme, replace UI strings with $t(), and update zh-CN/en/ar locale files. Use when asked to i18n-translate or replace Chinese text under src/. +--- + +# i18n Translate + +## Overview +Translate user-facing Chinese text under `src/` into i18n keys and replace with `$t()`-based lookups, using a deterministic hash key scheme to avoid collisions. + +## Workflow + +### 1) Scope and Scan +- Work only under `src/` unless explicitly told otherwise. +- Find Chinese strings with `rg -n "[\u4e00-\u9fff]" src` or a targeted subset of files. +- **Do not translate comment text**. Ignore all comments (`//`, `/* */`, ``) even if they contain Chinese. +- Ignore logs unless they are user-facing. + +### 2) Decide What to Translate (Skip “code-registered” Chinese) +Translate **UI-facing** strings only. Skip Chinese text that is **code-registered** or data-bound and must remain stable for logic or backend contracts. Use these heuristics: + +Translate: +- Template text nodes and labels +- Button text +- Placeholders and tips +- Validation messages / $message / $confirm copy +- Table column labels and UI action names + +Do **not** translate: +- Strings used as identifiers, keys, enums, or backend codes (e.g., API params, comparison values, switch cases, dataset keys) +- Strings used in logs or debug output (unless explicitly required) +- Brand names or externally mandated proper nouns + +If uncertain, prefer **not** translating and leave a short note. + +### 3) Generate Keys (Hash Rule) + +**CRITICAL: You MUST use the script to generate keys. DO NOT manually create keys or guess the hash values.** + +Key format: `{file_hash}.{text_hash}` +- `file_hash` = md5 hash of the file path, first 8 hex chars +- `text_hash` = md5 hash of the Chinese text, first 6 hex chars + +**Always run this script** (path relative to workspace root): + +```bash +python3 .cursor/skills/i18n-translate/scripts/gen_i18n_key.py --path "src/views/xxx.vue" --text "中文文本" +# Output example: a1b2c3d4.e5f6a7 +``` + +For batch processing, use JSONL mode (recommended for efficiency): +```bash +cat << 'EOF' | python3 .cursor/skills/i18n-translate/scripts/gen_i18n_key.py --jsonl +{"path":"src/views/xxx.vue","text":"文本1"} +{"path":"src/views/xxx.vue","text":"文本2"} +EOF +``` + +**DO NOT:** +- ❌ Make up keys like `d2e3f4a5.a1b2c3` without running the script +- ❌ Use semantic keys like `common.download` or `withdraw.status` +- ❌ Copy keys from other files without regenerating +- ❌ Assume you know what the hash output will be + +**DO:** +- ✅ Run the script for every Chinese text before replacing +- ✅ Use the exact output from the script as the key +- ✅ Use JSONL mode for batch processing multiple texts in one file + +### 4) Replace Strings with $t() +Use appropriate `$t()` usage by context: +- Template text: `{{ $t('key') }}` +- Attributes: `:placeholder="$t('key')"` +- JS strings: `this.$t('key')` (or `t('key')` if you already bind `const t = this.$t.bind(this)`) +- Render functions: `t('key')` or `this.$t('key')` + +### 5) Update Locale Files (Overwrite if Key Exists) +Update all three locale files: +- `src/i18n/locales/zh-CN.json` +- `src/i18n/locales/en.json` +- `src/i18n/locales/ar.json` + +Rules: +- zh-CN value = original Chinese text +- en/ar value = **MUST first lookup from existing translations** (see below), then translate if not found +- If the key already exists, **overwrite** with the new value + +### 5.1) CRITICAL: Lookup Existing Translations First + +**Before translating any Chinese text to English/Arabic, you MUST search in the existing translation reference file:** + +``` +src/i18n/lang/index.json +``` + +This file contains ~44,000 lines of already calibrated translations in this format: +```json +{ + "key": { + "zh-cn": "中文文本", + "en": "English translation", + "ar": "الترجمة العربية" + } +} +``` + +**Lookup Process:** +1. For each Chinese text you need to translate, search in `index.json` by the Chinese value (`zh-cn` field) +2. If found, use the existing `en` and `ar` values directly - these are professionally calibrated +3. Only if NOT found in `index.json`, then generate your own translation + +**Example:** +- Chinese text: "删除成功" +- Search in index.json for `"zh-cn": "删除成功"` +- If found: use the existing `en` and `ar` values +- If not found: translate as "Deleted successfully" / "تم الحذف بنجاح" + +**DO NOT:** +- ❌ Skip the lookup step and translate directly +- ❌ Ignore existing translations in `index.json` +- ❌ Use your own translation when a calibrated one exists + +**DO:** +- ✅ Always search `index.json` first for each Chinese text +- ✅ Use `grep` or similar to find: `grep -A2 '"zh-cn": "中文文本"' src/i18n/lang/index.json` +- ✅ Prioritize existing calibrated translations over AI-generated ones +- ✅ Only generate new translations for texts not found in `index.json` + +### 6) Verify +- Re-scan modified files to ensure the Chinese UI text is removed. +- Keep diffs focused and avoid refactors. + +## Resources + +All scripts are located in `.cursor/skills/i18n-translate/scripts/` relative to the workspace root. + +### gen_i18n_key.py +Generate keys from file path and Chinese text. + +Usage: +```bash +python3 .cursor/skills/i18n-translate/scripts/gen_i18n_key.py --path --text +``` + +JSONL mode (recommended for batch processing): +```bash +cat items.jsonl | python3 .cursor/skills/i18n-translate/scripts/gen_i18n_key.py --jsonl +# input line: {"path":"...","text":"..."} +# output line: {"path":"...","text":"...","key":"..."} +``` + +Example with heredoc: +```bash +cat << 'EOF' | python3 .cursor/skills/i18n-translate/scripts/gen_i18n_key.py --jsonl +{"path":"src/view/mall/marketing/withdraw.vue","text":"提现状态"} +{"path":"src/view/mall/marketing/withdraw.vue","text":"分销商手机号"} +EOF +``` + +### check_i18n_keys.py +Check i18n key usage vs locale files. + +Usage: +```bash +python3 .cursor/skills/i18n-translate/scripts/check_i18n_keys.py --src src --locales src/i18n/locales +``` + +Options: +- `--list` Print full missing/unused lists +- `--clean` Remove unused keys from locale files +- `--no-fail` Always exit 0 even if missing keys exist diff --git a/.cursor/skills/i18n-translate/agents/openai.yaml b/.cursor/skills/i18n-translate/agents/openai.yaml new file mode 100644 index 0000000..6faaa19 --- /dev/null +++ b/.cursor/skills/i18n-translate/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "i18n Translate" + short_description: "Translate Chinese UI strings to i18n keys with hashed prefixes" + default_prompt: "Scan src for Chinese UI strings, generate hashed i18n keys, replace with (), and update zh-CN/en/ar locales." diff --git a/.cursor/skills/i18n-translate/plans/marketing_keys.jsonl b/.cursor/skills/i18n-translate/plans/marketing_keys.jsonl new file mode 100644 index 0000000..1675b31 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/marketing_keys.jsonl @@ -0,0 +1,38 @@ +{"path":"src/router/routes/modules/marketing.js","text":"营销"} +{"path":"src/router/routes/modules/marketing.js","text":"券管理"} +{"path":"src/router/routes/modules/marketing.js","text":"券包管理"} +{"path":"src/router/routes/modules/marketing.js","text":"发券记录"} +{"path":"src/router/routes/modules/marketing.js","text":"群发优惠券"} +{"path":"src/router/routes/modules/marketing.js","text":"满折"} +{"path":"src/router/routes/modules/marketing.js","text":"满减"} +{"path":"src/router/routes/modules/marketing.js","text":"满赠"} +{"path":"src/router/routes/modules/marketing.js","text":"限时特惠"} +{"path":"src/router/routes/modules/marketing.js","text":"加价购"} +{"path":"src/router/routes/modules/marketing.js","text":"组合购"} +{"path":"src/router/routes/modules/marketing.js","text":"新客营销"} +{"path":"src/router/routes/modules/marketing.js","text":"定向营销"} +{"path":"src/router/routes/modules/marketing.js","text":"优先购"} +{"path":"src/router/routes/modules/marketing.js","text":"自动化营销"} +{"path":"src/router/routes/modules/marketing.js","text":"商品推荐"} +{"path":"src/router/routes/modules/marketing.js","text":"积分升值"} +{"path":"src/router/routes/modules/marketing.js","text":"额外积分"} +{"path":"src/router/routes/modules/marketing.js","text":"拼团"} +{"path":"src/router/routes/modules/marketing.js","text":"拼团-活动报名-活动报名-满赠管理-详情"} +{"path":"src/router/routes/modules/marketing.js","text":"微信助力"} +{"path":"src/router/routes/modules/marketing.js","text":"基础设置"} +{"path":"src/router/routes/modules/marketing.js","text":"推广员管理"} +{"path":"src/router/routes/modules/marketing.js","text":"等级管理"} +{"path":"src/router/routes/modules/marketing.js","text":"推广员业绩"} +{"path":"src/router/routes/modules/marketing.js","text":"提现申请"} +{"path":"src/router/routes/modules/marketing.js","text":"分销商品"} +{"path":"src/router/routes/modules/marketing.js","text":"任务佣金明细"} +{"path":"src/router/routes/modules/marketing.js","text":"任务佣金统计"} +{"path":"src/router/routes/modules/marketing.js","text":"小程序直播"} +{"path":"src/router/routes/modules/marketing.js","text":"小程序直播-活动报名-活动报名-直播-编辑"} +{"path":"src/router/routes/modules/marketing.js","text":"全部活动"} +{"path":"src/router/routes/modules/marketing.js","text":"报名记录"} +{"path":"src/router/routes/modules/marketing.js","text":"表单元素"} +{"path":"src/router/routes/modules/marketing.js","text":"表单元素配置-编辑"} +{"path":"src/router/routes/modules/marketing.js","text":"表单模板"} +{"path":"src/router/routes/modules/marketing.js","text":"表单模板配置-编辑"} +{"path":"src/router/routes/modules/marketing.js","text":"大转盘"} diff --git a/.cursor/skills/i18n-translate/plans/router_keys_batch.jsonl b/.cursor/skills/i18n-translate/plans/router_keys_batch.jsonl new file mode 100644 index 0000000..ab1d104 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/router_keys_batch.jsonl @@ -0,0 +1,95 @@ +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"设置"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"账号管理-店铺管理员"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"账号管理-店铺员工角色"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"账号管理-店铺配送员"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"导出列表"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"开户管理"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"提现设置"} +{"path":"src/router/src/route-shopadmin-shopsetting.js","text":"权限申请"} +{"path":"src/router/src/route-supplier-entitygoods.js","text":"商品"} +{"path":"src/router/src/route-shopadmin-entity.js","text":"商品"} +{"path":"src/router/src/route-shopadmin-store.js","text":"店铺"} +{"path":"src/router/src/route-shopadmin-statistics.js","text":"报表"} +{"path":"src/router/src/route-shopadmin-marketing.js","text":"营销"} +{"path":"src/router/src/route-sellers.js","text":"商家"} +{"path":"src/router/src/route-sellers.js","text":"商户设置"} +{"path":"src/router/src/route-pointsmall.js","text":"积分商城"} +{"path":"src/router/src/route-companydata.js","text":"统计"} +{"path":"src/router/src/route-auth.js","text":"授权-登录"} +{"path":"src/router/src/route-auth.js","text":"授权-店铺登录"} +{"path":"src/router/src/route-auth.js","text":"授权-商户登录"} +{"path":"src/router/src/route-auth.js","text":"授权-经销商登录"} +{"path":"src/router/src/route-auth.js","text":"shuyun登录"} +{"path":"src/router/src/route-auth.js","text":"模板编辑"} +{"path":"src/router/src/route-auth.js","text":"Pc模板编辑"} +{"path":"src/router/src/route-auth.js","text":"供应商登录"} +{"path":"src/router/src/route-auth.js","text":"供应商入驻"} +{"path":"src/router/src/route-supplier-applications.js","text":"应用"} +{"path":"src/router/src/route-supplier-applications.js","text":"分账明细"} +{"path":"src/router/src/route-supplier-applications.js","text":"提现"} +{"path":"src/router/src/route-supplier-applications.js","text":"提现设置"} +{"path":"src/router/src/route-supplier-applications.js","text":"开户信息"} +{"path":"src/router/src/route-supplier-applications.js","text":"开户审批"} +{"path":"src/router/src/route-supplier-applications.js","text":"商户设置"} +{"path":"src/router/src/route-supplier-applications.js","text":"商品管理"} +{"path":"src/router/src/route-supplier-applications.js","text":"实体商品导入"} +{"path":"src/router/src/route-supplier-applications.js","text":"商品库存导入"} +{"path":"src/router/src/route-supplier-applications.js","text":"实物订单"} +{"path":"src/router/src/route-supplier-applications.js","text":"基础设置"} +{"path":"src/router/src/route-supplier-applications.js","text":"扩展应用"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"应用"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"进件管理"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"分账"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"提现"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"进件信息"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"分账明细"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"员工内购"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"员工管理"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"白名单导入"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"企业管理"} +{"path":"src/router/src/route-shopadmin-applications.js","text":"内购订单"} +{"path":"src/router/src/route-applications.js","text":"应用"} +{"path":"src/router/src/route-applications.js","text":"分账明细"} +{"path":"src/router/src/route-applications.js","text":"抽奖活动"} +{"path":"src/router/src/route-applications.js","text":"提现"} +{"path":"src/router/src/route-applications.js","text":"提现设置"} +{"path":"src/router/src/route-applications.js","text":"开户信息"} +{"path":"src/router/src/route-applications.js","text":"开户审批"} +{"path":"src/router/src/route-applications.js","text":"商户设置"} +{"path":"src/router/src/route-applications.js","text":"商品管理"} +{"path":"src/router/src/route-applications.js","text":"实体商品导入"} +{"path":"src/router/src/route-applications.js","text":"商品库存导入"} +{"path":"src/router/src/route-applications.js","text":"实物订单"} +{"path":"src/router/src/route-applications.js","text":"基础设置"} +{"path":"src/router/src/route-applications.js","text":"扩展应用"} +{"path":"src/router/src/route-applications.js","text":"用户进件审批"} +{"path":"src/router/src/route-applications.js","text":"员工内购"} +{"path":"src/router/src/route-applications.js","text":"员工管理"} +{"path":"src/router/src/route-applications.js","text":"白名单导入"} +{"path":"src/router/src/route-applications.js","text":"企业管理"} +{"path":"src/router/src/route-applications.js","text":"内购订单"} +{"path":"src/router/src/route-applications.js","text":"企业微信设置"} +{"path":"src/router/src/route-applications.js","text":"导购货架首页"} +{"path":"src/router/src/route-applications.js","text":"社区团购订单"} +{"path":"src/router/src/route-applications.js","text":"基础配置"} +{"path":"src/router/src/route-applications.js","text":"社区管理"} +{"path":"src/router/src/route-applications.js","text":"活动管理"} +{"path":"src/router/src/route-applications.js","text":"配送单"} +{"path":"src/router/src/route-applications.js","text":"积分提现"} +{"path":"src/router/src/route-applications.js","text":"社区订单"} +{"path":"src/router/src/route-applications.js","text":"团长管理"} +{"path":"src/router/src/route-applications.js","text":"活动商品"} +{"path":"src/router/src/route-applications.js","text":"订单管理"} +{"path":"src/router/src/route-applications.js","text":"活动配置"} +{"path":"src/router/src/route-applications.js","text":"街道社区配置"} +{"path":"src/router/src/route-applications.js","text":"团长业绩"} +{"path":"src/router/src/route-applications.js","text":"提现申请"} +{"path":"src/router/src/route-applications.js","text":"团长导入"} +{"path":"src/router/merchant/route-entitygoods.js","text":"商品"} +{"path":"src/router/merchant/route-sellers.js","text":"商家"} +{"path":"src/router/merchant/route-order.js","text":"交易"} +{"path":"src/router/merchant/route-companydata.js","text":"统计"} +{"path":"src/router/merchant/route-applications.js","text":"应用"} +{"path":"src/router/merchant/route-applications.js","text":"进件管理"} +{"path":"src/router/merchant/route-applications.js","text":"分账明细"} +{"path":"src/router/src/route-applications.js","text":"社区活动-社区管理-详情"} diff --git a/.cursor/skills/i18n-translate/plans/routes_locale_en.txt b/.cursor/skills/i18n-translate/plans/routes_locale_en.txt new file mode 100644 index 0000000..b566453 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/routes_locale_en.txt @@ -0,0 +1,240 @@ + "031da93d.2685c0": "Trade", + "031da93d.51e9e1": "Refund", + "031da93d.70536c": "After-sales detail", + "031da93d.72ab0d": "Physical orders", + "031da93d.75bfab": "After-sales list", + "031da93d.8054f7": "Order detail", + "031da93d.8ab066": "Transaction", + "031da93d.94b1b9": "Refund detail", + "031da93d.afbe0f": "Order process", + "031da93d.ea0ea2": "Refund failure log", + "088817ee.0f09a8": "Merchant", + "088817ee.135e7b": "Alipay settings", + "088817ee.20cd45": "Performance detail", + "088817ee.5da484": "Store template", + "088817ee.808d6c": "Salesperson", + "088817ee.82e4c8": "Merchant info", + "088817ee.922ec0": "Edit store", + "088817ee.9d54ec": "Store details", + "088817ee.a4d703": "Store list", + "088817ee.a6ebab": "Salesperson subordinates", + "088817ee.ad8ef8": "Distribution pool", + "088817ee.b0bf8e": "Salesperson performance", + "088817ee.bd5e8a": "WeChat Pay settings", + "088817ee.c096c4": "After-sales address", + "088817ee.f8e42e": "Salesperson withdrawal", + "4f279119.5b0520": "Applications", + "4f279119.85b2f8": "Profit sharing details", + "4f279119.91287f": "Withdrawal review", + "4f279119.d38018": "Entry management", + "4f279119.db7971": "Withdrawal", + "4f279119.ee8348": "Profit sharing detail", + "55038796.022564": "Profit import", + "55038796.104fec": "Supply", + "55038796.1e4a8e": "Supplier list", + "55038796.55c7cb": "Supplier account", + "55038796.5782b6": "Product management", + "55038796.9745ac": "Product import", + "55038796.a453a5": "Product review", + "55038796.ac5320": "Stock import", + "6478e260.081090": "Store upload", + "6478e260.08894b": "Store rules", + "6478e260.135e7b": "Alipay settings", + "6478e260.1b1b01": "Self-operated store", + "6478e260.295713": "Store", + "6478e260.5da484": "Store template", + "6478e260.6356a8": "Return address", + "6478e260.899e90": "Store whitelist", + "6478e260.922ec0": "Edit store", + "6478e260.9d54ec": "Store details", + "6478e260.ba584c": "Whitelist upload", + "6478e260.bd5e8a": "WeChat Pay settings", + "6a7a6499.0585e2": "Coupon issue settings", + "6a7a6499.070f26": "Settlement summary", + "6a7a6499.0fabdb": "Edit knowledge", + "6a7a6499.103053": "Withdrawal record", + "6a7a6499.151685": "Profit sharing stats detail", + "6a7a6499.209e3b": "Store guide", + "6a7a6499.29b09e": "Store transaction stats", + "6a7a6499.309dd8": "Work WeChat - Contacts", + "6a7a6499.398e76": "Performance stats", + "6a7a6499.51d6c2": "Guide check-in", + "6a7a6499.63cf82": "Store statistics", + "6a7a6499.8cce7c": "Settlement detail", + "6a7a6499.9dbf41": "Transaction statistics", + "6a7a6499.a0e20d": "Profit sharing stats", + "6a7a6499.afe31d": "Edit notification", + "6a7a6499.c38352": "Product statistics", + "6a7a6499.d6f79b": "Delivery performance", + "6a7a6499.d7656a": "Statistics", + "6a7a6499.dc1e9e": "Guide complaint", + "6a7a6499.de94d9": "Guide notification", + "6a7a6499.ea8541": "Guide knowledge", + "766e6b00.135e7b": "Alipay settings", + "766e6b00.147bf3": "Store code", + "766e6b00.20cd45": "Performance detail", + "766e6b00.295713": "Store", + "766e6b00.306c79": "Salesperson detail", + "766e6b00.3adfae": "Sub promoter", + "766e6b00.40f82e": "Mobile mall", + "766e6b00.5da484": "Store template", + "766e6b00.808d6c": "Salesperson", + "766e6b00.884bdf": "Sub salesperson", + "766e6b00.899e90": "Store whitelist", + "766e6b00.922ec0": "Edit store", + "766e6b00.9d54ec": "Store details", + "766e6b00.a6ebab": "Salesperson subordinates", + "766e6b00.ad8d69": "Distribution goods", + "766e6b00.b0bf8e": "Salesperson performance", + "766e6b00.ba584c": "Whitelist upload", + "766e6b00.bd5e8a": "WeChat Pay settings", + "766e6b00.d0acc7": "Ad copy edit", + "766e6b00.de1e62": "Promoter detail", + "766e6b00.e7e6e2": "Store info", + "766e6b00.e8f87a": "Ad copy", + "766e6b00.f08fa2": "Promoter list", + "766e6b00.f6b1df": "Mall details", + "766e6b00.f8e42e": "Salesperson withdrawal", + "7d3fbb6d.06bc38": "Page SEO", + "7d3fbb6d.12688a": "Member center", + "7d3fbb6d.1c1143": "Splash ad", + "7d3fbb6d.226fc6": "Category", + "7d3fbb6d.398e60": "Nearby stores", + "7d3fbb6d.5a0a70": "Template list", + "7d3fbb6d.7de289": "Login page", + "7d3fbb6d.81b2cb": "Decoration", + "7d3fbb6d.c701e9": "Mall theme", + "7d3fbb6d.cc5507": "Mall info", + "7d3fbb6d.db1c89": "Home", + "7d3fbb6d.e807b2": "SEO config", + "7d3fbb6d.ec20e4": "Custom page", + "837b3054.07c516": "Company management", + "837b3054.24bc07": "Logistics info", + "837b3054.5b0520": "Applications", + "837b3054.725d82": "Create purchase activity", + "837b3054.7d9c7d": "Entry info", + "837b3054.8054f7": "Order detail", + "837b3054.85b2f8": "Profit sharing details", + "837b3054.91287f": "Withdrawal review", + "837b3054.98818a": "Profit sharing", + "837b3054.afbe0f": "Order process", + "837b3054.afcd11": "Order management", + "837b3054.b08ef3": "Dependents", + "837b3054.b33603": "Employee management", + "837b3054.d24ac2": "Purchase activity result", + "837b3054.d285a2": "Activity management", + "837b3054.d38018": "Entry management", + "837b3054.d9a9d8": "After-sales service", + "837b3054.db7971": "Withdrawal", + "837b3054.eba44e": "Whitelist import", + "837b3054.ee8348": "Profit sharing detail", + "837b3054.f8f84a": "Profit sharing detail", + "837b3054.fa3aee": "Add product", + "98f1dc59.4c48e9": "Supplier settlement summary", + "98f1dc59.b8fe8d": "Finance", + "a0c3da4f.0aeca0": "Basic settings", + "a0c3da4f.0d9697": "Physical product import", + "a0c3da4f.5782b6": "Product management", + "a0c3da4f.a13364": "Points mall", + "a0c3da4f.afcd11": "Order management", + "a0c3da4f.e9f31e": "Stock import", + "a38a4db1.070f26": "Settlement summary", + "a38a4db1.30117a": "VAT confirmation", + "a38a4db1.385f74": "Supplier settlement config", + "a38a4db1.3965e5": "Settlement config", + "a38a4db1.4c48e9": "Supplier settlement summary", + "a38a4db1.51e9e1": "Refund", + "a38a4db1.682360": "Transfer voucher review", + "a38a4db1.7c2544": "Refund failed", + "a38a4db1.8ab066": "Transaction", + "a38a4db1.91d8a5": "Seller info", + "a38a4db1.b8fe8d": "Finance", + "a38a4db1.bcd859": "Invoice config", + "a38a4db1.d16abb": "Invoice application", + "a38a4db1.e4a771": "Invoice tax rate", + "a4b9392f.863853": "Overview", + "c15892aa.07166e": "Order list", + "c15892aa.0ccaa3": "Appointment settings", + "c15892aa.106f81": "Service verification", + "c15892aa.160adc": "After-sales reason", + "c15892aa.220e22": "Appointment", + "c15892aa.425991": "Batch shipment", + "c15892aa.44d46e": "Purchase limit", + "c15892aa.4c117f": "Orders", + "c15892aa.66cd47": "Order config", + "c15892aa.6d923e": "Gift packaging", + "c15892aa.75bfab": "After-sales list", + "c15892aa.a509ca": "Self-operated orders", + "c15892aa.aae16d": "Store orders", + "c15892aa.b8c40b": "Cart reminder", + "c15892aa.caa2e5": "Appointment order", + "c15892aa.cfebe1": "Service order", + "c15892aa.d42283": "Prescription orders", + "c15892aa.fb1213": "Split bill", + "de2e3a36.070f26": "Settlement summary", + "de2e3a36.0d8307": "Data", + "de2e3a36.63cf82": "Store statistics", + "de2e3a36.d6f79b": "Delivery performance", + "df3e4f24.5b0520": "Applications", + "df3e4f24.85b2f8": "Profit sharing details", + "df3e4f24.d38018": "Entry management", + "df3e4f24.ee8348": "Profit sharing detail", + "e4519b2c.080fda": "Export record", + "e4519b2c.0d8307": "Data", + "e4519b2c.63cf82": "Store statistics", + "e4519b2c.843ff0": "Member statistics", + "e4519b2c.9dbf41": "Transaction statistics", + "e4519b2c.c38352": "Product statistics", + "ec5a39ee.863853": "Overview", + "f58886c3.0303d0": "Chief management", + "f58886c3.0901bf": "Issue error log", + "f58886c3.09cfa9": "Chief performance", + "f58886c3.1a4f21": "Gift management", + "f58886c3.1c120b": "Full discount", + "f58886c3.203870": "Edit purchase limit", + "f58886c3.26b2e2": "Edit markup", + "f58886c3.33011e": "Withdrawal request", + "f58886c3.3e9a00": "Bundle", + "f58886c3.42a5b5": "Registration record", + "f58886c3.42f9f7": "Activity products", + "f58886c3.44d46e": "Purchase limit", + "f58886c3.54e654": "Markup purchase", + "f58886c3.595788": "Edit gift", + "f58886c3.5e06be": "All activities", + "f58886c3.62c605": "Purchase detail", + "f58886c3.63ecba": "Purchase result", + "f58886c3.6e5918": "Employee purchase", + "f58886c3.725e84": "Issue record", + "f58886c3.7424a4": "Record detail", + "f58886c3.782c47": "Chief detail", + "f58886c3.7a075e": "Edit kill", + "f58886c3.8054f7": "Order detail", + "f58886c3.87b8c5": "Edit coupon", + "f58886c3.916801": "Marketing", + "f58886c3.92325c": "Flash kill", + "f58886c3.94b1fd": "Full reduction", + "f58886c3.9bd915": "Edit activity", + "f58886c3.a0aaca": "Flash sale", + "f58886c3.a39453": "Edit full reduction", + "f58886c3.afbe0f": "Order process", + "f58886c3.afcd11": "Order management", + "f58886c3.b08ef3": "Dependents", + "f58886c3.b24f85": "Activity config", + "f58886c3.bf673c": "Purchase list", + "f58886c3.cb7034": "Coupon detail", + "f58886c3.cccaa4": "Edit flash sale", + "f58886c3.d0465c": "Employee purchase", + "f58886c3.d285a2": "Activity management", + "f58886c3.e3440a": "Coupon management", + "f58886c3.e6c6bd": "Chief review", + "f58886c3.e90d30": "Edit purchase", + "f58886c3.f652be": "Create purchase", + "f58886c3.f880b2": "Record edit", + "f58886c3.fa3aee": "Add product", + "f98d9cde.f4f12c": "Bind", + "fb06c42c.20d385": "Settlement review", + "fb06c42c.6356a8": "Return address", + "fb06c42c.654af8": "Settled stores", + "fb06c42c.9f1ea3": "Merchant", + "fb06c42c.b2662c": "Merchant category", + "fb06c42c.e86c4b": "Store tags" \ No newline at end of file diff --git a/.cursor/skills/i18n-translate/plans/routes_locale_zh.txt b/.cursor/skills/i18n-translate/plans/routes_locale_zh.txt new file mode 100644 index 0000000..841ba68 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/routes_locale_zh.txt @@ -0,0 +1,240 @@ + "031da93d.2685c0": "交易", + "031da93d.51e9e1": "退款单", + "031da93d.70536c": "售后详情", + "031da93d.72ab0d": "实物订单", + "031da93d.75bfab": "售后列表", + "031da93d.8054f7": "订单详情", + "031da93d.8ab066": "交易单", + "031da93d.94b1b9": "退款详情", + "031da93d.afbe0f": "订单处理", + "031da93d.ea0ea2": "退款失败日志", + "088817ee.0f09a8": "商家", + "088817ee.135e7b": "支付宝设置", + "088817ee.20cd45": "业绩详情", + "088817ee.5da484": "店铺模板", + "088817ee.808d6c": "业务员", + "088817ee.82e4c8": "商家信息", + "088817ee.922ec0": "编辑店铺", + "088817ee.9d54ec": "店铺详情", + "088817ee.a4d703": "店铺列表", + "088817ee.a6ebab": "业务员下级", + "088817ee.ad8ef8": "分销商品池", + "088817ee.b0bf8e": "业务员业绩", + "088817ee.bd5e8a": "微信支付设置", + "088817ee.c096c4": "售后地址", + "088817ee.f8e42e": "业务员提现", + "4f279119.5b0520": "应用", + "4f279119.85b2f8": "分账明细", + "4f279119.91287f": "提现审核", + "4f279119.d38018": "进件管理", + "4f279119.db7971": "提现", + "4f279119.ee8348": "分账明细详情", + "55038796.022564": "分润导入", + "55038796.104fec": "供应", + "55038796.1e4a8e": "供应商列表", + "55038796.55c7cb": "供应商账号", + "55038796.5782b6": "商品管理", + "55038796.9745ac": "商品导入", + "55038796.a453a5": "商品审核", + "55038796.ac5320": "库存导入", + "6478e260.081090": "店铺上传", + "6478e260.08894b": "进店规则", + "6478e260.135e7b": "支付宝设置", + "6478e260.1b1b01": "自营店铺", + "6478e260.295713": "店铺", + "6478e260.5da484": "店铺模板", + "6478e260.6356a8": "退货地址", + "6478e260.899e90": "店铺白名单", + "6478e260.922ec0": "编辑店铺", + "6478e260.9d54ec": "店铺详情", + "6478e260.ba584c": "白名单上传", + "6478e260.bd5e8a": "微信支付设置", + "6a7a6499.0585e2": "优惠券发放设置", + "6a7a6499.070f26": "结算汇总", + "6a7a6499.0fabdb": "编辑知识库", + "6a7a6499.103053": "提现记录", + "6a7a6499.151685": "分账统计详情", + "6a7a6499.209e3b": "店铺导购员", + "6a7a6499.29b09e": "店铺交易统计", + "6a7a6499.309dd8": "企业微信-通讯录", + "6a7a6499.398e76": "业绩统计", + "6a7a6499.51d6c2": "导购签到记录", + "6a7a6499.63cf82": "店铺统计", + "6a7a6499.8cce7c": "结算详情", + "6a7a6499.9dbf41": "交易统计", + "6a7a6499.a0e20d": "分账统计", + "6a7a6499.afe31d": "编辑通知", + "6a7a6499.c38352": "商品统计", + "6a7a6499.d6f79b": "配送员业绩", + "6a7a6499.d7656a": "统计", + "6a7a6499.dc1e9e": "导购员投诉", + "6a7a6499.de94d9": "导购员通知", + "6a7a6499.ea8541": "导购知识库", + "766e6b00.135e7b": "支付宝设置", + "766e6b00.147bf3": "店铺码", + "766e6b00.20cd45": "业绩详情", + "766e6b00.295713": "店铺", + "766e6b00.306c79": "业务员详情", + "766e6b00.3adfae": "下级推广员", + "766e6b00.40f82e": "移动商城", + "766e6b00.5da484": "店铺模板", + "766e6b00.808d6c": "业务员", + "766e6b00.884bdf": "下级业务员", + "766e6b00.899e90": "店铺白名单", + "766e6b00.922ec0": "编辑店铺", + "766e6b00.9d54ec": "店铺详情", + "766e6b00.a6ebab": "业务员下级", + "766e6b00.ad8d69": "分销商品", + "766e6b00.b0bf8e": "业务员业绩", + "766e6b00.ba584c": "白名单上传", + "766e6b00.bd5e8a": "微信支付设置", + "766e6b00.d0acc7": "软文编辑", + "766e6b00.de1e62": "推广员详情", + "766e6b00.e7e6e2": "店铺信息", + "766e6b00.e8f87a": "软文", + "766e6b00.f08fa2": "推广员列表", + "766e6b00.f6b1df": "商城详情", + "766e6b00.f8e42e": "业务员提现", + "7d3fbb6d.06bc38": "页面SEO", + "7d3fbb6d.12688a": "会员中心", + "7d3fbb6d.1c1143": "开屏广告", + "7d3fbb6d.226fc6": "分类页", + "7d3fbb6d.398e60": "附近店铺页", + "7d3fbb6d.5a0a70": "模板列表", + "7d3fbb6d.7de289": "登录页", + "7d3fbb6d.81b2cb": "装修", + "7d3fbb6d.c701e9": "商城配色", + "7d3fbb6d.cc5507": "商城信息", + "7d3fbb6d.db1c89": "首页", + "7d3fbb6d.e807b2": "SEO配置", + "7d3fbb6d.ec20e4": "自定义页", + "837b3054.07c516": "企业管理", + "837b3054.24bc07": "物流信息", + "837b3054.5b0520": "应用", + "837b3054.725d82": "创建内购活动", + "837b3054.7d9c7d": "进件信息", + "837b3054.8054f7": "订单详情", + "837b3054.85b2f8": "分账明细", + "837b3054.91287f": "提现审核", + "837b3054.98818a": "分账", + "837b3054.afbe0f": "订单处理", + "837b3054.afcd11": "订单管理", + "837b3054.b08ef3": "家属管理", + "837b3054.b33603": "员工管理", + "837b3054.d24ac2": "内购活动结果", + "837b3054.d285a2": "活动管理", + "837b3054.d38018": "进件管理", + "837b3054.d9a9d8": "售后服务", + "837b3054.db7971": "提现", + "837b3054.eba44e": "白名单导入", + "837b3054.ee8348": "分账明细详情", + "837b3054.f8f84a": "分账详情", + "837b3054.fa3aee": "添加商品", + "98f1dc59.4c48e9": "供应商结算汇总", + "98f1dc59.b8fe8d": "财务", + "a0c3da4f.0aeca0": "基础设置", + "a0c3da4f.0d9697": "实体商品导入", + "a0c3da4f.5782b6": "商品管理", + "a0c3da4f.a13364": "积分商城", + "a0c3da4f.afcd11": "订单管理", + "a0c3da4f.e9f31e": "商品库存导入", + "a38a4db1.070f26": "结算汇总", + "a38a4db1.30117a": "专票确认书", + "a38a4db1.385f74": "供应商结算配置", + "a38a4db1.3965e5": "结算配置", + "a38a4db1.4c48e9": "供应商结算汇总", + "a38a4db1.51e9e1": "退款单", + "a38a4db1.682360": "转账凭证审核", + "a38a4db1.7c2544": "退款失败", + "a38a4db1.8ab066": "交易单", + "a38a4db1.91d8a5": "销方信息", + "a38a4db1.b8fe8d": "财务", + "a38a4db1.bcd859": "发票配置", + "a38a4db1.d16abb": "开票申请", + "a38a4db1.e4a771": "开票税率", + "a4b9392f.863853": "概览", + "c15892aa.07166e": "订单列表", + "c15892aa.0ccaa3": "预约设置", + "c15892aa.106f81": "服务核销单", + "c15892aa.160adc": "售后原因", + "c15892aa.220e22": "预约管理", + "c15892aa.425991": "批量发货", + "c15892aa.44d46e": "商品限购", + "c15892aa.4c117f": "订单", + "c15892aa.66cd47": "订单配置", + "c15892aa.6d923e": "礼品包装", + "c15892aa.75bfab": "售后列表", + "c15892aa.a509ca": "自营订单", + "c15892aa.aae16d": "店铺订单", + "c15892aa.b8c40b": "购物提醒", + "c15892aa.caa2e5": "预约单", + "c15892aa.cfebe1": "服务订单", + "c15892aa.d42283": "处方药订单", + "c15892aa.fb1213": "分账单", + "de2e3a36.070f26": "结算汇总", + "de2e3a36.0d8307": "数据", + "de2e3a36.63cf82": "店铺统计", + "de2e3a36.d6f79b": "配送员业绩", + "df3e4f24.5b0520": "应用", + "df3e4f24.85b2f8": "分账明细", + "df3e4f24.d38018": "进件管理", + "df3e4f24.ee8348": "分账明细详情", + "e4519b2c.080fda": "导出记录", + "e4519b2c.0d8307": "数据", + "e4519b2c.63cf82": "店铺统计", + "e4519b2c.843ff0": "会员统计", + "e4519b2c.9dbf41": "交易统计", + "e4519b2c.c38352": "商品统计", + "ec5a39ee.863853": "概览", + "f58886c3.0303d0": "团长管理", + "f58886c3.0901bf": "发放错误日志", + "f58886c3.09cfa9": "团长业绩", + "f58886c3.1a4f21": "满赠管理", + "f58886c3.1c120b": "满折", + "f58886c3.203870": "编辑商品限购", + "f58886c3.26b2e2": "编辑加价购", + "f58886c3.33011e": "提现申请", + "f58886c3.3e9a00": "组合购", + "f58886c3.42a5b5": "报名记录", + "f58886c3.42f9f7": "活动商品", + "f58886c3.44d46e": "商品限购", + "f58886c3.54e654": "加价购", + "f58886c3.595788": "编辑满赠", + "f58886c3.5e06be": "全部活动", + "f58886c3.62c605": "内购详情", + "f58886c3.63ecba": "内购结果", + "f58886c3.6e5918": "员工内购", + "f58886c3.725e84": "发券记录", + "f58886c3.7424a4": "记录详情", + "f58886c3.782c47": "团长详情", + "f58886c3.7a075e": "编辑秒杀", + "f58886c3.8054f7": "订单详情", + "f58886c3.87b8c5": "编辑优惠券", + "f58886c3.916801": "营销", + "f58886c3.92325c": "限时秒杀", + "f58886c3.94b1fd": "满减", + "f58886c3.9bd915": "编辑活动", + "f58886c3.a0aaca": "限时特惠", + "f58886c3.a39453": "编辑满减", + "f58886c3.afbe0f": "订单处理", + "f58886c3.afcd11": "订单管理", + "f58886c3.b08ef3": "家属管理", + "f58886c3.b24f85": "活动配置", + "f58886c3.bf673c": "内购列表", + "f58886c3.cb7034": "优惠券详情", + "f58886c3.cccaa4": "编辑限时特惠", + "f58886c3.d0465c": "内购", + "f58886c3.d285a2": "活动管理", + "f58886c3.e3440a": "优惠券管理", + "f58886c3.e6c6bd": "团长审核", + "f58886c3.e90d30": "编辑内购", + "f58886c3.f652be": "创建内购", + "f58886c3.f880b2": "记录编辑", + "f58886c3.fa3aee": "添加商品", + "f98d9cde.f4f12c": "绑定", + "fb06c42c.20d385": "入驻审核", + "fb06c42c.6356a8": "退货地址", + "fb06c42c.654af8": "入驻店铺", + "fb06c42c.9f1ea3": "商户", + "fb06c42c.b2662c": "商户类目", + "fb06c42c.e86c4b": "店铺标签" \ No newline at end of file diff --git a/.cursor/skills/i18n-translate/plans/routes_title_keys.jsonl b/.cursor/skills/i18n-translate/plans/routes_title_keys.jsonl new file mode 100644 index 0000000..0be8bf1 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/routes_title_keys.jsonl @@ -0,0 +1,240 @@ +{"path": "src/router/auth.js", "text": "绑定", "key": "f98d9cde.f4f12c"} +{"path": "src/router/routes/modules/dashboard.js", "text": "概览", "key": "a4b9392f.863853"} +{"path": "src/router/routes/modules/data.js", "text": "数据", "key": "e4519b2c.0d8307"} +{"path": "src/router/routes/modules/data.js", "text": "商品统计", "key": "e4519b2c.c38352"} +{"path": "src/router/routes/modules/data.js", "text": "交易统计", "key": "e4519b2c.9dbf41"} +{"path": "src/router/routes/modules/data.js", "text": "会员统计", "key": "e4519b2c.843ff0"} +{"path": "src/router/routes/modules/data.js", "text": "店铺统计", "key": "e4519b2c.63cf82"} +{"path": "src/router/routes/modules/data.js", "text": "导出记录", "key": "e4519b2c.080fda"} +{"path": "src/router/routes/modules/decoration.js", "text": "装修", "key": "7d3fbb6d.81b2cb"} +{"path": "src/router/routes/modules/decoration.js", "text": "首页", "key": "7d3fbb6d.db1c89"} +{"path": "src/router/routes/modules/decoration.js", "text": "附近店铺页", "key": "7d3fbb6d.398e60"} +{"path": "src/router/routes/modules/decoration.js", "text": "分类页", "key": "7d3fbb6d.226fc6"} +{"path": "src/router/routes/modules/decoration.js", "text": "自定义页", "key": "7d3fbb6d.ec20e4"} +{"path": "src/router/routes/modules/decoration.js", "text": "商城配色", "key": "7d3fbb6d.c701e9"} +{"path": "src/router/routes/modules/decoration.js", "text": "会员中心", "key": "7d3fbb6d.12688a"} +{"path": "src/router/routes/modules/decoration.js", "text": "商城信息", "key": "7d3fbb6d.cc5507"} +{"path": "src/router/routes/modules/decoration.js", "text": "开屏广告", "key": "7d3fbb6d.1c1143"} +{"path": "src/router/routes/modules/decoration.js", "text": "模板列表", "key": "7d3fbb6d.5a0a70"} +{"path": "src/router/routes/modules/decoration.js", "text": "登录页", "key": "7d3fbb6d.7de289"} +{"path": "src/router/routes/modules/decoration.js", "text": "SEO配置", "key": "7d3fbb6d.e807b2"} +{"path": "src/router/routes/modules/decoration.js", "text": "页面SEO", "key": "7d3fbb6d.06bc38"} +{"path": "src/router/routes/modules/financial.js", "text": "财务", "key": "a38a4db1.b8fe8d"} +{"path": "src/router/routes/modules/financial.js", "text": "交易单", "key": "a38a4db1.8ab066"} +{"path": "src/router/routes/modules/financial.js", "text": "退款单", "key": "a38a4db1.51e9e1"} +{"path": "src/router/routes/modules/financial.js", "text": "退款失败", "key": "a38a4db1.7c2544"} +{"path": "src/router/routes/modules/financial.js", "text": "结算配置", "key": "a38a4db1.3965e5"} +{"path": "src/router/routes/modules/financial.js", "text": "结算汇总", "key": "a38a4db1.070f26"} +{"path": "src/router/routes/modules/financial.js", "text": "供应商结算配置", "key": "a38a4db1.385f74"} +{"path": "src/router/routes/modules/financial.js", "text": "供应商结算汇总", "key": "a38a4db1.4c48e9"} +{"path": "src/router/routes/modules/financial.js", "text": "转账凭证审核", "key": "a38a4db1.682360"} +{"path": "src/router/routes/modules/financial.js", "text": "开票申请", "key": "a38a4db1.d16abb"} +{"path": "src/router/routes/modules/financial.js", "text": "发票配置", "key": "a38a4db1.bcd859"} +{"path": "src/router/routes/modules/financial.js", "text": "销方信息", "key": "a38a4db1.91d8a5"} +{"path": "src/router/routes/modules/financial.js", "text": "开票税率", "key": "a38a4db1.e4a771"} +{"path": "src/router/routes/modules/financial.js", "text": "专票确认书", "key": "a38a4db1.30117a"} +{"path": "src/router/routes/modules/orders.js", "text": "订单", "key": "c15892aa.4c117f"} +{"path": "src/router/routes/modules/orders.js", "text": "订单列表", "key": "c15892aa.07166e"} +{"path": "src/router/routes/modules/orders.js", "text": "自营订单", "key": "c15892aa.a509ca"} +{"path": "src/router/routes/modules/orders.js", "text": "批量发货", "key": "c15892aa.425991"} +{"path": "src/router/routes/modules/orders.js", "text": "售后列表", "key": "c15892aa.75bfab"} +{"path": "src/router/routes/modules/orders.js", "text": "订单配置", "key": "c15892aa.66cd47"} +{"path": "src/router/routes/modules/orders.js", "text": "礼品包装", "key": "c15892aa.6d923e"} +{"path": "src/router/routes/modules/orders.js", "text": "售后原因", "key": "c15892aa.160adc"} +{"path": "src/router/routes/modules/orders.js", "text": "购物提醒", "key": "c15892aa.b8c40b"} +{"path": "src/router/routes/modules/orders.js", "text": "商品限购", "key": "c15892aa.44d46e"} +{"path": "src/router/routes/modules/orders.js", "text": "处方药订单", "key": "c15892aa.d42283"} +{"path": "src/router/routes/modules/orders.js", "text": "店铺订单", "key": "c15892aa.aae16d"} +{"path": "src/router/routes/modules/orders.js", "text": "分账单", "key": "c15892aa.fb1213"} +{"path": "src/router/routes/modules/orders.js", "text": "服务订单", "key": "c15892aa.cfebe1"} +{"path": "src/router/routes/modules/orders.js", "text": "服务核销单", "key": "c15892aa.106f81"} +{"path": "src/router/routes/modules/orders.js", "text": "预约管理", "key": "c15892aa.220e22"} +{"path": "src/router/routes/modules/orders.js", "text": "预约设置", "key": "c15892aa.0ccaa3"} +{"path": "src/router/routes/modules/orders.js", "text": "预约单", "key": "c15892aa.caa2e5"} +{"path": "src/router/routes/modules/point.js", "text": "积分商城", "key": "a0c3da4f.a13364"} +{"path": "src/router/routes/modules/point.js", "text": "商品管理", "key": "a0c3da4f.5782b6"} +{"path": "src/router/routes/modules/point.js", "text": "实体商品导入", "key": "a0c3da4f.0d9697"} +{"path": "src/router/routes/modules/point.js", "text": "商品库存导入", "key": "a0c3da4f.e9f31e"} +{"path": "src/router/routes/modules/point.js", "text": "订单管理", "key": "a0c3da4f.afcd11"} +{"path": "src/router/routes/modules/point.js", "text": "基础设置", "key": "a0c3da4f.0aeca0"} +{"path": "src/router/routes/modules/sellers.js", "text": "商户", "key": "fb06c42c.9f1ea3"} +{"path": "src/router/routes/modules/sellers.js", "text": "入驻店铺", "key": "fb06c42c.654af8"} +{"path": "src/router/routes/modules/sellers.js", "text": "入驻审核", "key": "fb06c42c.20d385"} +{"path": "src/router/routes/modules/sellers.js", "text": "退货地址", "key": "fb06c42c.6356a8"} +{"path": "src/router/routes/modules/sellers.js", "text": "店铺标签", "key": "fb06c42c.e86c4b"} +{"path": "src/router/routes/modules/sellers.js", "text": "商户类目", "key": "fb06c42c.b2662c"} +{"path": "src/router/routes/modules/store.js", "text": "店铺", "key": "6478e260.295713"} +{"path": "src/router/routes/modules/store.js", "text": "自营店铺", "key": "6478e260.1b1b01"} +{"path": "src/router/routes/modules/store.js", "text": "编辑店铺", "key": "6478e260.922ec0"} +{"path": "src/router/routes/modules/store.js", "text": "店铺模板", "key": "6478e260.5da484"} +{"path": "src/router/routes/modules/store.js", "text": "店铺详情", "key": "6478e260.9d54ec"} +{"path": "src/router/routes/modules/store.js", "text": "微信支付设置", "key": "6478e260.bd5e8a"} +{"path": "src/router/routes/modules/store.js", "text": "支付宝设置", "key": "6478e260.135e7b"} +{"path": "src/router/routes/modules/store.js", "text": "店铺上传", "key": "6478e260.081090"} +{"path": "src/router/routes/modules/store.js", "text": "店铺白名单", "key": "6478e260.899e90"} +{"path": "src/router/routes/modules/store.js", "text": "白名单上传", "key": "6478e260.ba584c"} +{"path": "src/router/routes/modules/store.js", "text": "进店规则", "key": "6478e260.08894b"} +{"path": "src/router/routes/modules/store.js", "text": "退货地址", "key": "6478e260.6356a8"} +{"path": "src/router/routes/modules/supplier.js", "text": "供应", "key": "55038796.104fec"} +{"path": "src/router/routes/modules/supplier.js", "text": "商品管理", "key": "55038796.5782b6"} +{"path": "src/router/routes/modules/supplier.js", "text": "库存导入", "key": "55038796.ac5320"} +{"path": "src/router/routes/modules/supplier.js", "text": "分润导入", "key": "55038796.022564"} +{"path": "src/router/routes/modules/supplier.js", "text": "商品导入", "key": "55038796.9745ac"} +{"path": "src/router/routes/modules/supplier.js", "text": "商品审核", "key": "55038796.a453a5"} +{"path": "src/router/routes/modules/supplier.js", "text": "供应商列表", "key": "55038796.1e4a8e"} +{"path": "src/router/routes/modules/supplier.js", "text": "供应商账号", "key": "55038796.55c7cb"} +{"path": "src/router/routes/shopadmin/data.js", "text": "数据", "key": "de2e3a36.0d8307"} +{"path": "src/router/routes/shopadmin/data.js", "text": "店铺统计", "key": "de2e3a36.63cf82"} +{"path": "src/router/routes/shopadmin/data.js", "text": "结算汇总", "key": "de2e3a36.070f26"} +{"path": "src/router/routes/shopadmin/data.js", "text": "配送员业绩", "key": "de2e3a36.d6f79b"} +{"path": "src/router/routes/shopadmin/store.js", "text": "店铺", "key": "766e6b00.295713"} +{"path": "src/router/routes/shopadmin/store.js", "text": "店铺信息", "key": "766e6b00.e7e6e2"} +{"path": "src/router/routes/shopadmin/store.js", "text": "编辑店铺", "key": "766e6b00.922ec0"} +{"path": "src/router/routes/shopadmin/store.js", "text": "店铺模板", "key": "766e6b00.5da484"} +{"path": "src/router/routes/shopadmin/store.js", "text": "店铺详情", "key": "766e6b00.9d54ec"} +{"path": "src/router/routes/shopadmin/store.js", "text": "微信支付设置", "key": "766e6b00.bd5e8a"} +{"path": "src/router/routes/shopadmin/store.js", "text": "支付宝设置", "key": "766e6b00.135e7b"} +{"path": "src/router/routes/shopadmin/store.js", "text": "店铺白名单", "key": "766e6b00.899e90"} +{"path": "src/router/routes/shopadmin/store.js", "text": "白名单上传", "key": "766e6b00.ba584c"} +{"path": "src/router/routes/shopadmin/store.js", "text": "店铺码", "key": "766e6b00.147bf3"} +{"path": "src/router/routes/shopadmin/store.js", "text": "业务员", "key": "766e6b00.808d6c"} +{"path": "src/router/routes/shopadmin/store.js", "text": "业务员详情", "key": "766e6b00.306c79"} +{"path": "src/router/routes/shopadmin/store.js", "text": "下级业务员", "key": "766e6b00.884bdf"} +{"path": "src/router/routes/shopadmin/store.js", "text": "业务员下级", "key": "766e6b00.a6ebab"} +{"path": "src/router/routes/shopadmin/store.js", "text": "分销商品", "key": "766e6b00.ad8d69"} +{"path": "src/router/routes/shopadmin/store.js", "text": "推广员列表", "key": "766e6b00.f08fa2"} +{"path": "src/router/routes/shopadmin/store.js", "text": "推广员详情", "key": "766e6b00.de1e62"} +{"path": "src/router/routes/shopadmin/store.js", "text": "下级推广员", "key": "766e6b00.3adfae"} +{"path": "src/router/routes/shopadmin/store.js", "text": "业务员业绩", "key": "766e6b00.b0bf8e"} +{"path": "src/router/routes/shopadmin/store.js", "text": "业绩详情", "key": "766e6b00.20cd45"} +{"path": "src/router/routes/shopadmin/store.js", "text": "业务员提现", "key": "766e6b00.f8e42e"} +{"path": "src/router/routes/shopadmin/store.js", "text": "移动商城", "key": "766e6b00.40f82e"} +{"path": "src/router/routes/shopadmin/store.js", "text": "商城详情", "key": "766e6b00.f6b1df"} +{"path": "src/router/routes/shopadmin/store.js", "text": "软文", "key": "766e6b00.e8f87a"} +{"path": "src/router/routes/shopadmin/store.js", "text": "软文编辑", "key": "766e6b00.d0acc7"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "营销", "key": "f58886c3.916801"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "优惠券管理", "key": "f58886c3.e3440a"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑优惠券", "key": "f58886c3.87b8c5"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "优惠券详情", "key": "f58886c3.cb7034"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "发券记录", "key": "f58886c3.725e84"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "发放错误日志", "key": "f58886c3.0901bf"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "加价购", "key": "f58886c3.54e654"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑加价购", "key": "f58886c3.26b2e2"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "组合购", "key": "f58886c3.3e9a00"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "限时特惠", "key": "f58886c3.a0aaca"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑限时特惠", "key": "f58886c3.cccaa4"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "商品限购", "key": "f58886c3.44d46e"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑商品限购", "key": "f58886c3.203870"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "满折", "key": "f58886c3.1c120b"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "满减", "key": "f58886c3.94b1fd"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑满减", "key": "f58886c3.a39453"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "满赠管理", "key": "f58886c3.1a4f21"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑满赠", "key": "f58886c3.595788"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "限时秒杀", "key": "f58886c3.92325c"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑秒杀", "key": "f58886c3.7a075e"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "团长管理", "key": "f58886c3.0303d0"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "团长详情", "key": "f58886c3.782c47"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "团长审核", "key": "f58886c3.e6c6bd"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "活动管理", "key": "f58886c3.d285a2"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "订单管理", "key": "f58886c3.afcd11"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "订单详情", "key": "f58886c3.8054f7"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "订单处理", "key": "f58886c3.afbe0f"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "活动商品", "key": "f58886c3.42f9f7"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "活动配置", "key": "f58886c3.b24f85"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "团长业绩", "key": "f58886c3.09cfa9"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "提现申请", "key": "f58886c3.33011e"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "内购", "key": "f58886c3.d0465c"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "内购列表", "key": "f58886c3.bf673c"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "创建内购", "key": "f58886c3.f652be"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "内购结果", "key": "f58886c3.63ecba"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "添加商品", "key": "f58886c3.fa3aee"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "家属管理", "key": "f58886c3.b08ef3"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "员工内购", "key": "f58886c3.6e5918"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑内购", "key": "f58886c3.e90d30"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "内购详情", "key": "f58886c3.62c605"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "全部活动", "key": "f58886c3.5e06be"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "编辑活动", "key": "f58886c3.9bd915"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "报名记录", "key": "f58886c3.42a5b5"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "记录详情", "key": "f58886c3.7424a4"} +{"path": "src/router/routes/shopadmin/marketing.js", "text": "记录编辑", "key": "f58886c3.f880b2"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "应用", "key": "837b3054.5b0520"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "提现审核", "key": "837b3054.91287f"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "提现", "key": "837b3054.db7971"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "进件管理", "key": "837b3054.d38018"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "分账明细", "key": "837b3054.85b2f8"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "分账明细详情", "key": "837b3054.ee8348"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "分账", "key": "837b3054.98818a"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "分账详情", "key": "837b3054.f8f84a"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "进件信息", "key": "837b3054.7d9c7d"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "活动管理", "key": "837b3054.d285a2"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "创建内购活动", "key": "837b3054.725d82"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "内购活动结果", "key": "837b3054.d24ac2"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "添加商品", "key": "837b3054.fa3aee"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "家属管理", "key": "837b3054.b08ef3"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "企业管理", "key": "837b3054.07c516"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "员工管理", "key": "837b3054.b33603"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "白名单导入", "key": "837b3054.eba44e"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "订单管理", "key": "837b3054.afcd11"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "订单详情", "key": "837b3054.8054f7"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "订单处理", "key": "837b3054.afbe0f"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "售后服务", "key": "837b3054.d9a9d8"} +{"path": "src/router/routes/shopadmin/apps.js", "text": "物流信息", "key": "837b3054.24bc07"} +{"path": "src/router/routes/supplier/apps.js", "text": "应用", "key": "df3e4f24.5b0520"} +{"path": "src/router/routes/supplier/apps.js", "text": "进件管理", "key": "df3e4f24.d38018"} +{"path": "src/router/routes/supplier/apps.js", "text": "分账明细", "key": "df3e4f24.85b2f8"} +{"path": "src/router/routes/supplier/apps.js", "text": "分账明细详情", "key": "df3e4f24.ee8348"} +{"path": "src/router/routes/supplier/financial.js", "text": "财务", "key": "98f1dc59.b8fe8d"} +{"path": "src/router/routes/supplier/financial.js", "text": "供应商结算汇总", "key": "98f1dc59.4c48e9"} +{"path": "src/router/routes/merchant/dashboard.js", "text": "概览", "key": "ec5a39ee.863853"} +{"path": "src/router/routes/merchant/sellers.js", "text": "商家", "key": "088817ee.0f09a8"} +{"path": "src/router/routes/merchant/sellers.js", "text": "商家信息", "key": "088817ee.82e4c8"} +{"path": "src/router/routes/merchant/sellers.js", "text": "店铺列表", "key": "088817ee.a4d703"} +{"path": "src/router/routes/merchant/sellers.js", "text": "编辑店铺", "key": "088817ee.922ec0"} +{"path": "src/router/routes/merchant/sellers.js", "text": "店铺模板", "key": "088817ee.5da484"} +{"path": "src/router/routes/merchant/sellers.js", "text": "店铺详情", "key": "088817ee.9d54ec"} +{"path": "src/router/routes/merchant/sellers.js", "text": "微信支付设置", "key": "088817ee.bd5e8a"} +{"path": "src/router/routes/merchant/sellers.js", "text": "支付宝设置", "key": "088817ee.135e7b"} +{"path": "src/router/routes/merchant/sellers.js", "text": "售后地址", "key": "088817ee.c096c4"} +{"path": "src/router/routes/merchant/sellers.js", "text": "分销商品池", "key": "088817ee.ad8ef8"} +{"path": "src/router/routes/merchant/sellers.js", "text": "业务员", "key": "088817ee.808d6c"} +{"path": "src/router/routes/merchant/sellers.js", "text": "业务员下级", "key": "088817ee.a6ebab"} +{"path": "src/router/routes/merchant/sellers.js", "text": "业务员业绩", "key": "088817ee.b0bf8e"} +{"path": "src/router/routes/merchant/sellers.js", "text": "业绩详情", "key": "088817ee.20cd45"} +{"path": "src/router/routes/merchant/sellers.js", "text": "业务员提现", "key": "088817ee.f8e42e"} +{"path": "src/router/routes/merchant/order.js", "text": "交易", "key": "031da93d.2685c0"} +{"path": "src/router/routes/merchant/order.js", "text": "实物订单", "key": "031da93d.72ab0d"} +{"path": "src/router/routes/merchant/order.js", "text": "订单详情", "key": "031da93d.8054f7"} +{"path": "src/router/routes/merchant/order.js", "text": "订单处理", "key": "031da93d.afbe0f"} +{"path": "src/router/routes/merchant/order.js", "text": "售后列表", "key": "031da93d.75bfab"} +{"path": "src/router/routes/merchant/order.js", "text": "售后详情", "key": "031da93d.70536c"} +{"path": "src/router/routes/merchant/order.js", "text": "交易单", "key": "031da93d.8ab066"} +{"path": "src/router/routes/merchant/order.js", "text": "退款单", "key": "031da93d.51e9e1"} +{"path": "src/router/routes/merchant/order.js", "text": "退款详情", "key": "031da93d.94b1b9"} +{"path": "src/router/routes/merchant/order.js", "text": "退款失败日志", "key": "031da93d.ea0ea2"} +{"path": "src/router/routes/merchant/data.js", "text": "统计", "key": "6a7a6499.d7656a"} +{"path": "src/router/routes/merchant/data.js", "text": "交易统计", "key": "6a7a6499.9dbf41"} +{"path": "src/router/routes/merchant/data.js", "text": "店铺统计", "key": "6a7a6499.63cf82"} +{"path": "src/router/routes/merchant/data.js", "text": "商品统计", "key": "6a7a6499.c38352"} +{"path": "src/router/routes/merchant/data.js", "text": "结算汇总", "key": "6a7a6499.070f26"} +{"path": "src/router/routes/merchant/data.js", "text": "配送员业绩", "key": "6a7a6499.d6f79b"} +{"path": "src/router/routes/merchant/data.js", "text": "分账统计", "key": "6a7a6499.a0e20d"} +{"path": "src/router/routes/merchant/data.js", "text": "分账统计详情", "key": "6a7a6499.151685"} +{"path": "src/router/routes/merchant/data.js", "text": "提现记录", "key": "6a7a6499.103053"} +{"path": "src/router/routes/merchant/data.js", "text": "店铺交易统计", "key": "6a7a6499.29b09e"} +{"path": "src/router/routes/merchant/data.js", "text": "导购签到记录", "key": "6a7a6499.51d6c2"} +{"path": "src/router/routes/merchant/data.js", "text": "店铺导购员", "key": "6a7a6499.209e3b"} +{"path": "src/router/routes/merchant/data.js", "text": "优惠券发放设置", "key": "6a7a6499.0585e2"} +{"path": "src/router/routes/merchant/data.js", "text": "导购知识库", "key": "6a7a6499.ea8541"} +{"path": "src/router/routes/merchant/data.js", "text": "编辑知识库", "key": "6a7a6499.0fabdb"} +{"path": "src/router/routes/merchant/data.js", "text": "导购员通知", "key": "6a7a6499.de94d9"} +{"path": "src/router/routes/merchant/data.js", "text": "编辑通知", "key": "6a7a6499.afe31d"} +{"path": "src/router/routes/merchant/data.js", "text": "业绩统计", "key": "6a7a6499.398e76"} +{"path": "src/router/routes/merchant/data.js", "text": "导购员投诉", "key": "6a7a6499.dc1e9e"} +{"path": "src/router/routes/merchant/data.js", "text": "企业微信-通讯录", "key": "6a7a6499.309dd8"} +{"path": "src/router/routes/merchant/data.js", "text": "结算详情", "key": "6a7a6499.8cce7c"} +{"path": "src/router/routes/merchant/apps.js", "text": "应用", "key": "4f279119.5b0520"} +{"path": "src/router/routes/merchant/apps.js", "text": "提现审核", "key": "4f279119.91287f"} +{"path": "src/router/routes/merchant/apps.js", "text": "提现", "key": "4f279119.db7971"} +{"path": "src/router/routes/merchant/apps.js", "text": "进件管理", "key": "4f279119.d38018"} +{"path": "src/router/routes/merchant/apps.js", "text": "分账明细", "key": "4f279119.85b2f8"} +{"path": "src/router/routes/merchant/apps.js", "text": "分账明细详情", "key": "4f279119.ee8348"} diff --git a/.cursor/skills/i18n-translate/plans/src_api.md b/.cursor/skills/i18n-translate/plans/src_api.md new file mode 100644 index 0000000..e956ab8 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_api.md @@ -0,0 +1,116 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/api` +**报告文件**: `src_api.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 5 | 5.4% | +| 无需翻译 | 88 | 94.6% | +| **合计** | **93** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `common.js` +- `req.js` +- `request/index copy.js` +- `request/index.js` +- `shopmenu.js` + +## 无需翻译 + +- `account.js` +- `adapay.js` +- `adapay/dealer.js` +- `addressBook.js` +- `aftersales.js` +- `aftersalesreason.js` +- `ali.js` +- `aliminiapp.js` +- `application.js` +- `article.js` +- `auth.js` +- `bspay.js` +- `cardticket.js` +- `community.js` +- `company.js` +- `coupons_package.js` +- `crossborder.js` +- `dada.js` +- `dataAnalysis.js` +- `datacube.js` +- `dealerReInfo.js` +- `deposit.js` +- `distributor.js` +- `encrypt.js` +- `fans.js` +- `fapiao.js` +- `fenzhang.js` +- `financial.js` +- `goods.js` +- `im.js` +- `index copy.js` +- `index.js` +- `login.js` +- `logistics.js` +- `mall/dada.js` +- `mall/index.js` +- `mall/marketing.js` +- `mall_marketing.js` +- `marketing.js` +- `member.js` +- `membercard.js` +- `menu.js` +- `minimanage.js` +- `offline.js` +- `onecode.js` +- `openapi.js` +- `openscreenad.js` +- `order.js` +- `ossStorage.js` +- `pcgoods.js` +- `pctemplate.js` +- `picker.js` +- `pickuplocation.js` +- `point.js` +- `pointsmall.js` +- `policy.js` +- `printer.js` +- `productUpdate.js` +- `promotions.js` +- `purchase.js` +- `qiniu.js` +- `ranking.js` +- `regionauth.js` +- `request/interceptor.js` +- `request/request.js` +- `reservation.js` +- `selfhelpform.js` +- `shipping.js` +- `shop.js` +- `shopScreen.js` +- `sms.js` +- `src/decortaion.js` +- `src/members.js` +- `src/store.js` +- `subdistrict.js` +- `supplier.js` +- `system.js` +- `tdkset.js` +- `template.js` +- `third.js` +- `trade.js` +- `transactionStatistics.js` +- `trustlogin.js` +- `ugc.js` +- `webtemplate.js` +- `wechat.js` +- `wxa.js` +- `wxastats.js` diff --git a/.cursor/skills/i18n-translate/plans/src_components.md b/.cursor/skills/i18n-translate/plans/src_components.md new file mode 100644 index 0000000..5bdf93a --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_components.md @@ -0,0 +1,237 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/components` +**报告文件**: `src_components.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 172 | 80.4% | +| 无需翻译 | 45 | 21.0% | +| **合计** | **214** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `sp-rich-text/index.vue` +- `template_editor/floorImg-two.vue` +- `template_editor/floorImg.vue` +- `template_editor/goods.vue` +- `template_editor/goods_grid.vue` +- `template_editor/goods_grid_tab.vue` +- `template_editor/tab_bar.vue` +- `template_editor/showcase.vue` +- `template_editor/search.vue` +- `template_editor/navigation.vue` +- `template_editor/marquees.vue` +- `template_editor/img-gif.vue` +- `template_editor/img_hotzone.vue` +- `template_editor/nearby_shop.vue` +- `template_editor/hotTopic.vue` +- `template_editor/goods_scroll.vue` +- `template_editor/newcoupon.vue` +- `template_links/index.vue` +- `template_links/comps/finder.vue` +- `template_links/comps/list.vue` +- `template_links/comps/store.vue` +- `template_links/comps/tabs.vue` +- `template_links/comps/wxalink.vue` +- `template_links_guide/index.vue` +- `template_links_guide/comps/finder.vue` +- `template_links_guide/comps/list.vue` +- `template_links_guide/comps/store.vue` +- `template_links_guide/comps/tabs.vue` +- `template_links_guide/comps/wxalink.vue` +- `template_editor/tab_bar_new.vue` +- `template_editor/apple_tab_bar.vue` +- `template_editor/coupon.vue` +- `template_editor/film.vue` +- `countdown/index.vue` +- `element/dataPlaceholder.vue` +- `loading-btn/index.vue` +- `remarkModal/index.vue` +- `sp-clipboard/index.vue` +- `LuckyWheel/index.vue` +- `addClassifyBox/index.vue` +- `sp-content-card/index.vue` +- `sp-platform-tip/index.vue` +- `sp-countdown/index.vue` +- `sp-dialog/index.vue` +- `sp-dialog-plus/main.vue` +- `sp-drawer/index.vue` +- `sp-pagination/index.vue` +- `customSimpleTable/index.vue` +- `sp-draggable/index.vue` +- `sp-filter-form/index.vue` +- `sp-form/index.vue` +- `sp-cropper/SpCropper.vue` +- `sp-image-picker/index.vue` +- `sp-image-uploader/SpImageUploader.vue` +- `sp-page-upload/index.vue` +- `sp-select-remote/index.vue` +- `sp-video-picker/index.vue` +- `sp-goods-group/index.vue` +- `sp-select-merchant-panel/index.vue` +- `sp-select-shop-panel/index.vue` +- `couponPackageSelect/index.vue` +- `couponSelect/index.vue` +- `regionSelect/index.vue` +- `shopSelect/index.vue` +- `shopSelect2/index.vue` +- `icon_picker/index.vue` +- `imageUpload/index.vue` +- `imageselect/index.vue` +- `coupon_picker/index.vue` +- `img_picker/index.vue` +- `new_tagselect/index.vue` +- `kqhjSelect/index.vue` +- `kqselect/index.vue` +- `messagesender/index.vue` +- `aterialanagementselect/index.vue` +- `goods_picker/index.vue` +- `kqselect/coupon.vue` +- `tagSelects/index.vue` +- `tagselect/index.vue` +- `function/articleSelector.vue` +- `function/storeFilter.vue` +- `storeListSelect/index.vue` +- `storeListSelect/newindex.vue` +- `storeselect/index.vue` +- `sp-select-shop/index.vue` +- `function/storeList.vue` +- `function/shopSelect.vue` +- `function/distributorOneSelect.vue` +- `function/crowdSelectV2.vue` +- `function/distributorSelect.vue` +- `function/regionauthOneSelect.vue` +- `function/skuSelector.vue` +- `function/skuSelectorPrice.vue` +- `function/goodsSelector.vue` +- `template/search.vue` +- `template/goods.vue` +- `sp-picker/pickers/picker-goods.vue` +- `function/comps/template-page-editor.vue` +- `function/consts/index.js` +- `function/mallDecoration.vue` +- `function/mallList.vue` +- `function/richTextEditor.vue` +- `function/shopDecoration.vue` +- `function/templatePreview.vue` +- `goodsSelect/index.vue` +- `sp-decorate/index.vue` +- `sp-form-plus/form-field.js` +- `sp-form-plus/index.vue` +- `sp-picker/main.vue` +- `sp-picker/pickers/base.js` +- `sp-picker/pickers/picker-store.vue` +- `sp-picker/pickers/picker-supplier.vue` +- `sp-picker/pickers/picker-tag.vue` +- `sp-picker/pickers/picker-template.vue` +- `sp-picker/pickers/picker-shoptag.vue` +- `sp-picker/pickers/picker-widget.vue` +- `sp-picker/pickers/picker-wxapp.vue` +- `sp-picker/pickers/picker-zitilist.vue` +- `sp-picker/pickers/picker-shop.vue` +- `sp-picker/pickers/picker-video.vue` +- `sp-picker/pickers/picker-image.vue` +- `sp-picker/pickers/picker-pages.vue` +- `sp-picker/pickers/picker-link.vue` +- `sp-picker/pickers/picker-coupon.vue` +- `sp-picker/pickers/picker-film.vue` +- `timechoose/index.vue` +- `sp-picker/pickers/picker-couponPackage.vue` +- `sp-picker/pickers/picker-path.vue` +- `uploadGoods/index.vue` +- `videoselect/index.vue` +- `sp-picker/pickers/picker-planting.vue` +- `withdrawShop/index.vue` +- `twxxselect/index.vue` +- `wbappselect/index.vue` +- `wechatshare/index.vue` +- `sp-picker/pickers/picker-aftersales.vue` +- `sp-picker/pickers/picker-regactivity.vue` +- `sp-picker/pickers/picker-seckill.vue` +- `sp-picker/pickers/picker-purchaseActivity.vue` +- `sp-picker/pickers/picker-saleCategory.vue` +- `sp-picker/pickers/picker-activityCollection.vue` +- `sp-picker/pickers/picker-article.vue` +- `sp-picker/pickers/picker-category.vue` +- `sp-picker/pickers/picker-company.vue` +- `sp-picker/pickers/picker-coupon-v2.vue` +- `sp-picker/pickers/picker-crowds.vue` +- `sp-picker/pickers/picker-editboard.vue` +- `sp-picker/pickers/picker-goodsParams.vue` +- `sp-picker/pickers/picker-goodsitem.vue` +- `sp-picker/pickers/picker-goodslist.vue` +- `sp-picker/pickers/picker-goodssku.vue` +- `sp-picker/pickers/picker-groups.vue` +- `sp-picker/pickers/picker-live.vue` +- `sp-picker/pickers/picker-lottery.vue` +- `sp-picker/pickers/picker-marketing.vue` +- `sp-picker/pickers/picker-ranking.vue` +- `sp-picker/pickers/picker-share-page.vue` +- `template/coupon.vue` +- `template/film.vue` +- `template/goods_grid.vue` +- `template/goods_grid_tab.vue` +- `template/goods_scroll.vue` +- `template/nearby_shop.vue` +- `template/newcoupon.vue` +- `template_editor/heading.vue` +- `template_editor/headline.vue` +- `template_editor/writing.vue` +- `template_editor/store.vue` +- `template_editor/slider.vue` + +## 无需翻译 + +- `element/imgBox.vue` +- `element/sideBar.vue` +- `export_tips/index.vue` +- `global_footer/index.vue` +- `hover_delete/index.vue` +- `sp-button/index.vue` +- `sp-dialog-plus/index.js` +- `sp-dialog-plus/plugin.js` +- `sp-filter-form-item/index.vue` +- `sp-form-plus/config.js` +- `sp-goods-card/index.vue` +- `sp-icon/index.vue` +- `sp-icon/preview.vue` +- `sp-image/index.vue` +- `sp-input/index.vue` +- `sp-iphone/index.vue` +- `sp-language/index.vue` +- `sp-page-header/index.vue` +- `sp-page/index.vue` +- `sp-picker/index.js` +- `sp-picker/mixins/page.js` +- `sp-picker/picker-type.vue` +- `sp-picker/pickers/index.js` +- `sp-picker/plugin.js` +- `sp-price/index.vue` +- `sp-region-select/index.vue` +- `sp-router-view/index.vue` +- `sp-select-merchant/index.vue` +- `sp-select-shop/index copy.vue` +- `sp-select-supplier/index.vue` +- `sp-tabs/index.vue` +- `template/floorImg-two.vue` +- `template/floorImg.vue` +- `template/heading.vue` +- `template/headline.vue` +- `template/hotTopic.vue` +- `template/img-gif.vue` +- `template/img_hotzone.vue` +- `template/marquees.vue` +- `template/navigation.vue` +- `template/showcase.vue` +- `template/slider.vue` +- `template/store.vue` +- `template/writing.vue` +- `tips/index.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_router.md b/.cursor/skills/i18n-translate/plans/src_router.md new file mode 100644 index 0000000..40c3b34 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_router.md @@ -0,0 +1,43 @@ +# i18n 扫描结果 + +**扫描目录**: `src/router` +**报告文件**: `src_router.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 约 50+ 文件 | - | +| 已翻译 | 1 | - | +| 无需翻译 | 若干(仅注释) | - | + +## 已翻译 + +- `routes/modules/marketing.js`、`products.js`、`content.js`、`setting.js` +- `routes/shopadmin/setting.js`、`routes/shopadmin/products.js` +- `routes/supplier/setting.js`、`routes/supplier/products.js` +- `routes/merchant/setting.js` +- `src/route-supplier-setting.js`、`route-supplier-base.js`、`route-shopadmin-base.js`、`route-shopadmin-shoplist.js`、`route-base.js`、`router-merchant-base.js` +- `src/route-dealer*.js`、`route-crossborder.js`、`route-pc.js`、`route-entitygoods.js`、`route-supply.js`、`route-store.js` +- `src/route-shopadmin-shopsetting.js`、`route-shopadmin-entity.js`、`route-shopadmin-store.js`、`route-shopadmin-statistics.js`、`route-shopadmin-marketing.js`、`route-shopadmin-applications.js` +- `src/route-supplier-entitygoods.js`、`route-supplier-applications.js` +- `src/route-sellers.js`、`route-pointsmall.js`、`route-companydata.js`、`route-auth.js`、`route-applications.js` +- `merchant/route-setting.js`、`merchant/route-entitygoods.js`、`merchant/route-sellers.js`、`merchant/route-order.js`、`merchant/route-companydata.js`、`merchant/route-applications.js` + +## 已翻译(routes 目录 meta.title / name) + +- `routes/modules/dashboard.js`、`data.js`、`decoration.js`、`financial.js`、`orders.js`、`point.js`、`sellers.js`、`store.js`、`supplier.js` — 全部 `title`/`name` 已替换为 i18n key +- `routes/shopadmin/data.js`、`store.js`、`marketing.js`、`apps.js` +- `routes/supplier/apps.js`、`financial.js` +- `routes/merchant/dashboard.js`、`sellers.js`、`order.js`、`data.js`、`apps.js` +- `auth.js` — `name: '绑定'` 已替换为 key + +## 未翻译完(仅注释或零散) + +- `routes/modules/apps.js`、`routes/modules/members.js` 仅注释含中文,不翻译 +- `route-applications.js` 内 `meta.title` 模板 `${name}-社区活动-社区管理-详情` 保留,key `5286ac37.2ab861` 已入 locale 供展示拼接 + +## 说明 + +- 路由中 `meta.title` / `name` 为界面菜单/面包屑展示用,已按 hash key 方案替换为 i18n key,并在 zh-CN / en / ar 中补全文案。 +- 菜单数据来自后端 `accessMenus`,前端路由 meta 用于文档标题或部分场景展示,需保证 key 在 locale 中存在。 diff --git a/.cursor/skills/i18n-translate/plans/src_view.md b/.cursor/skills/i18n-translate/plans/src_view.md new file mode 100644 index 0000000..80e0e34 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view.md @@ -0,0 +1,36 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view` +**报告文件**: `src_view.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 10 | 76.9% | +| 无需翻译 | 3 | 23.1% | +| **合计** | **13** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `404.vue` +- `authloading.vue` +- `forget.vue` +- `gyslogin.vue` +- `layout.vue` +- `merchantlogin.vue` +- `notExistAuth.vue` +- `shoplist.vue` +- `shoplogin.vue` +- `vshopuserrecord.vue` + +## 无需翻译 + +- `home.vue` +- `index.vue` +- `sublayout.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_applications.md b/.cursor/skills/i18n-translate/plans/src_view_applications.md new file mode 100644 index 0000000..9086bae --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_applications.md @@ -0,0 +1,34 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/applications` +**报告文件**: `src_view_applications.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 10 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **10** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `pointmall/add.vue` +- `plugin/appDetail.vue` +- `plugin/consts.js` +- `plugin/index.vue` +- `pointmall/setting.vue` +- `pointmall/goodsImport.vue` +- `pointmall/storeImport.vue` +- `pointmall/list.vue` +- `pointmall/orderList.vue` +- `pointmall/orderDetail.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_auth.md b/.cursor/skills/i18n-translate/plans/src_view_auth.md new file mode 100644 index 0000000..6136a28 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_auth.md @@ -0,0 +1,28 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/auth` +**报告文件**: `src_view_auth.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 4 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **4** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `certify.vue` +- `components/uploadImg.vue` +- `dealer_login.vue` +- `login.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_base.md b/.cursor/skills/i18n-translate/plans/src_view_base.md new file mode 100644 index 0000000..f3f5550 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_base.md @@ -0,0 +1,124 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/base` +**报告文件**: `src_view_base.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 95 | 95.9% | +| 无需翻译 | 6 | 6.1% | +| **合计** | **100** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `address/setting.vue` +- `setting/agreement/index.vue` +- `account/management.vue` +- `account/normalroles.vue` +- `account/normalstaff.vue` +- `account/roles.vue` +- `account/storeroles.vue` +- `account/storestaff.vue` +- `account/suppliers.vue` +- `app/index.vue` +- `app/masterofcoupon/index.vue` +- `app/masterofcoupon/capricious.vue` +- `app/masterofcoupon/consume.vue` +- `app/masterofcoupon/register.vue` +- `app/masterofcoupon/capriciousadd.vue` +- `app/masterofcoupon/giftadddialog.vue` +- `app/masterofcoupon/registeradd.vue` +- `app/masterofcoupon/share.vue` +- `article/index.vue` +- `empty/index.vue` +- `empty/unbind.vue` +- `article/editor.vue` +- `article/columns.vue` +- `article/generalcolumns.vue` +- `currency/index.vue` +- `asset/accountactivation/index.vue` +- `exportlog/index.vue` +- `member/rightsList.vue` +- `screen/openScreenAD.vue` +- `setting/addressBook/index.vue` +- `setting/list.vue` +- `setting/dataAnalysis.vue` +- `setting/dataAnalysis/youshu.vue` +- `setting/memberCenter/share.vue` +- `setting/memberCenter/banner.vue` +- `setting/memberCenter/redirect.vue` +- `setting/memberCenter/menuoption.vue` +- `setting/offlineAccount.vue` +- `setting/goodsShareSetting.vue` +- `setting/sharesetting.vue` +- `setting/opendev/index.vue` +- `setting/weburlsetting.vue` +- `setting/sfbsp.vue` +- `setting/shopexerp.vue` +- `setting/mapsetting.vue` +- `setting/mapsetting/youshu.vue` +- `setting/distribution/index.vue` +- `setting/im/backend.vue` +- `setting/im/frontend.vue` +- `shop/comments.vue` +- `shop/admininfo.vue` +- `shortmessage/index.vue` +- `shuyunLogin/index.vue` +- `wxa/index.vue` +- `index.vue` +- `merchant_index.vue` +- `screen/openScreenAD.vue` +- `setting/dealer/account_info.vue` +- `setting/dealer/contactShop.vue` +- `setting/dealer/cpn/bspay_result.vue` +- `setting/dealer/cpn/checkBox.vue` +- `setting/dealer/cpn/imageSelect.vue` +- `setting/dealer/cpn/result.vue` +- `setting/dealer/index.vue` +- `setting/dealer/pay_setting.vue` +- `setting/dealer/tools/index.js` +- `setting/dealer/upload_picture.vue` +- `setting/fapiao/fapiaoset.vue` +- `setting/fapiao/hangxin.vue` +- `setting/fapiao/list.vue` +- `setting/payment/adapay.vue` +- `setting/payment/alipay.vue` +- `setting/payment/bspay.vue` +- `setting/payment/chinaumspay.vue` +- `setting/payment/pointpay.vue` +- `setting/payment/ebuypay.vue` +- `setting/payment/hfpay.vue` +- `setting/payment/wxpay.vue` +- `setting/payment/offlinepay.vue` +- `setting/publicsetting copy.vue` +- `setting/workwechat/workwechat.vue` +- `setting/yilianyun/shop.vue` +- `shortmessage/finder-setting/sms_MassLog.js` +- `shortmessage/finder-setting/sms_sendLog.js` +- `shortmessage/finder-setting/sms_signatures.js` +- `shortmessage/finder-setting/sms_template.js` +- `shop/admininfo copy.vue` +- `shop/editshop.vue` +- `shop/wxshop.vue` +- `shopstaff/salesperson/leaderlist.vue` +- `trade/order/list.vue` +- `wxa/mendian.vue` +- `wxa/promotion.vue` +- `setting/payment copy.vue` +- `setting/payment/adapay copy.vue` + +## 无需翻译 + +- `app/masterofcoupon/menu.vue` +- `app/layout.vue` +- `iframeLogin/index.vue` +- `setting/dataAnalysis/comp/alert.vue` +- `setting/dealer/netin.vue` +- `setting/dealer/tools/eare.js` diff --git a/.cursor/skills/i18n-translate/plans/src_view_brand.md b/.cursor/skills/i18n-translate/plans/src_view_brand.md new file mode 100644 index 0000000..c69b0f5 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_brand.md @@ -0,0 +1,43 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/brand` +**报告文件**: `src_view_brand.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 16 | 80.0% | +| 无需翻译 | 4 | 20.0% | +| **合计** | **20** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `codegoods/thingslist.vue` +- `codegoods/batchsedit.vue` +- `codegoods/thingsbatchsdetail.vue` +- `codegoods/thingsedit.vue` +- `wechat/artical/list.vue` +- `wechat/artical/new_artical.vue` +- `wechat/custommenu.vue` +- `wechat/customservice.vue` +- `wechat/fans.vue` +- `wechat/images/list.vue` +- `wechat/localvideos/list.vue` +- `wechat/menu.vue` +- `wechat/reply.vue` +- `wechat/video/list.vue` +- `wechat/wxapp.vue` +- `wechat/localimages/list.vue` + +## 无需翻译 + +- `index.vue` +- `wechat/artical/index.vue` +- `wechat/localimages/base.js` +- `wechat/localimages/mixins/page.js` diff --git a/.cursor/skills/i18n-translate/plans/src_view_content.md b/.cursor/skills/i18n-translate/plans/src_view_content.md new file mode 100644 index 0000000..a365ca9 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_content.md @@ -0,0 +1,26 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/content` +**报告文件**: `src_view_content.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 2 | 66.7% | +| 无需翻译 | 1 | 33.3% | +| **合计** | **3** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `soft-article.vue` +- `soft-article-id.vue` + +## 无需翻译 + +- `consts.js`(行业数据键值供 API 使用,不翻译) diff --git a/.cursor/skills/i18n-translate/plans/src_view_core.md b/.cursor/skills/i18n-translate/plans/src_view_core.md new file mode 100644 index 0000000..1878338 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_core.md @@ -0,0 +1,25 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/core` +**报告文件**: `src_view_core.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 0 | 0.0% | +| 无需翻译 | 1 | 100.0% | +| **合计** | **1** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +(无) + +## 无需翻译 + +- `authentication/login.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_crossborder.md b/.cursor/skills/i18n-translate/plans/src_view_crossborder.md new file mode 100644 index 0000000..a5d95d7 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_crossborder.md @@ -0,0 +1,28 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/crossborder` +**报告文件**: `src_view_crossborder.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 4 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **4** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `crossborderset/info.vue` +- `origincountry/list.vue` +- `taxstrategy/edit.vue` +- `taxstrategy/list.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_dealer.md b/.cursor/skills/i18n-translate/plans/src_view_dealer.md new file mode 100644 index 0000000..2fc2dce --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_dealer.md @@ -0,0 +1,28 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/dealer` +**报告文件**: `src_view_dealer.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 4 | 100.0% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **4** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `account/index.vue` +- `distributor/index.vue` +- `bspay_create_user.vue` +- `create_account.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_decorate.md b/.cursor/skills/i18n-translate/plans/src_view_decorate.md new file mode 100644 index 0000000..a2e5887 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_decorate.md @@ -0,0 +1,164 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/decorate` +**报告文件**: `src_view_decorate.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 126 | 89.4% | +| 无需翻译 | 15 | 10.6% | +| **合计** | **141** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `pc/injectDomOperate.js` +- `wgts/wgt_slider/attr-item.vue` +- `wgts/wgt_slider/config.js` +- `wgts/wgt_speedkill/comps/seckillgoods.vue` +- `wgts/wgt_speedkill/config.js` +- `wgts/wgt_store/attr-goods.vue` +- `wgts/wgt_store/attr-label.vue` +- `wgts/wgt_store/attr-store.vue` +- `wgts/wgt_store/config.js` +- `wgts/wgt_store/index.vue` +- `wgts/wgt_slider/sliderDialog.vue` +- `wgts/wgt_slider/index.vue` +- `wgts/wgt_speedkill/index.vue` +- `wgts/wgt_store-alphabet/attr-store.vue` +- `wgts/wgt_store-alphabet/config.js` +- `wgts/wgt_store-alphabet/index.vue` +- `wgts/wgt_writing/config.js` +- `wgts/wgt_writing/index.vue` +- `wgts/wgt_locationModule/comp_panel.vue` +- `wgts/wgt_locationModule/comp_pickerLink.vue` +- `wgts/wgt_locationModule/nav-item.vue` +- `comps/configsetting.js` +- `pc/wgts/wgt_hotzone/index.js` +- `wgts/wgt-page/config.js` +- `wgts/wgt_classify/config.js` +- `wgts/wgt_contentPartition/comp_panel.vue` +- `wgts/wgt_contentPartition/config.js` +- `wgts/wgt_contentPartition/index.vue` +- `wgts/wgt_coupon/config.js` +- `wgts/wgt_film/config.js` +- `attr_panel.vue` +- `index.vue` +- `comps/comp-button.vue` +- `comps/comp-pickerLink.vue` +- `comps/comp-todoList.vue` +- `comps/comp_btn.vue` +- `comps/comp_background_inner.vue` +- `comps/comp_background_outer.vue` +- `comps/comp_dragList.vue` +- `comps/comp_layout_selector.vue` +- `comps/comp_navtext.vue` +- `comps/comp_style.vue` +- `comps/goods-attr/attr-data.vue` +- `comps/goods-layout/columngoods.vue` +- `comps/goods-layout/gridgoods.vue` +- `comps/goods-layout/rowgoods.vue` +- `pc/comps/wgt-modal.vue` +- `pc/index.vue` +- `pc/wgts/wgt_hotzone/attr-hotsetting.vue` +- `wgts/wgt-page/attr-function-area.vue` +- `wgts/wgt-page/attr-hotsetting.vue` +- `wgts/wgt-page/attr-item.vue` +- `wgts/wgt-page/index.vue` +- `wgts/wgt_classify/attr_data.vue` +- `wgts/wgt_classify/index.vue` +- `wgts/wgt_contentPartition/comp_pickerLink.vue` +- `wgts/wgt_contentPartition/nav-item.vue` +- `wgts/wgt_coupon/attr-data.vue` +- `wgts/wgt_coupon/index.vue` +- `wgts/wgt_film/index.vue` +- `wgts/wgt_floorImg/attr-imgList.vue` +- `wgts/wgt_fullSlider/attr-item.vue` +- `wgts/wgt_fullSlider/sliderDialog.vue` +- `wgts/wgt_goodsCard/attr-goods.vue` +- `wgts/wgt_goodsCard/index.vue` +- `wgts/wgt_goodsGrid/attr-goods.vue` +- `wgts/wgt_goodsGridTab/attr-class.vue` +- `wgts/wgt_goodsScroll/attr-goods.vue` +- `wgts/wgt_hotTopic/attr-item.vue` +- `wgts/wgt_floorImg/config.js` +- `wgts/wgt_floorImg/index.vue` +- `wgts/wgt_fullSlider/config.js` +- `wgts/wgt_fullSlider/index.vue` +- `wgts/wgt_goods/comps/goodsgoods.vue` +- `wgts/wgt_goods/config.js` +- `wgts/wgt_goods/index.vue` +- `wgts/wgt_goodsCard/config.js` +- `wgts/wgt_goodsGrid/config.js` +- `wgts/wgt_goodsGrid/index.vue` +- `wgts/wgt_goodsGridTab/config.js` +- `wgts/wgt_goodsGridTab/index.vue` +- `wgts/wgt_goodsScroll/config.js` +- `wgts/wgt_goodsScroll/index.vue` +- `wgts/wgt_group/comps/groupgoods.vue` +- `wgts/wgt_group/config.js` +- `wgts/wgt_group/index.vue` +- `wgts/wgt_heading/config.js` +- `wgts/wgt_heading/index.vue` +- `wgts/wgt_headline/config.js` +- `wgts/wgt_headline/index.vue` +- `wgts/wgt_hotTopic/config.js` +- `wgts/wgt_hotTopic/index.vue` +- `wgts/wgt_hotranking/comps/hotrankinggoods.vue` +- `wgts/wgt_hotranking/config.js` +- `wgts/wgt_hotranking/index.vue` +- `wgts/wgt_hotzone/attr-hotsetting.vue` +- `wgts/wgt_hotzone/config.js` +- `wgts/wgt_hotzone/index.vue` +- `wgts/wgt_imgNavigation/attr-imagepanel.vue` +- `wgts/wgt_imgNavigation/config.js` +- `wgts/wgt_imgNavigation/index.vue` +- `wgts/wgt_locationModule/config.js` +- `wgts/wgt_locationModule/index.vue` +- `wgts/wgt_nearbyShop/attr-category.vue` +- `wgts/wgt_nearbyShop/config.js` +- `wgts/wgt_nearbyShop/index.vue` +- `wgts/wgt_nearbyShop/product-label.vue` +- `wgts/wgt_orderNavigation/attr-imagepanel.vue` +- `wgts/wgt_orderNavigation/config.js` +- `wgts/wgt_orderNavigation/index.vue` +- `wgts/wgt_ranking/comps/rankinggoods.vue` +- `wgts/wgt_ranking/config.js` +- `wgts/wgt_ranking/index.vue` +- `wgts/wgt_search/config.js` +- `wgts/wgt_search/index.vue` +- `wgts/wgt_shop/attr-goods.vue` +- `wgts/wgt_shop/attr-label.vue` +- `wgts/wgt_shop/attr-store.vue` +- `wgts/wgt_shop/config.js` +- `wgts/wgt_shop/index.vue` +- `wgts/wgt_showcase/config.js` +- `wgts/wgt_showcase/index.vue` +- `wgts/wgt_marquees/attr_horizontal.vue` +- `wgts/wgt_marquees/attr_vertical.vue` +- `wgts/wgt_marquees/config.js` +- `wgts/wgt_marquees/index.vue` + +## 无需翻译 + +- `comps/comp-goods.vue` +- `comps/comp-price.vue` +- `comps/comp_cell.vue` +- `comps/index.js` +- `comps/style-utils.js` +- `comps/transform-utils.js` +- `pc/comps/sp-iframe.vue` +- `pc/injectCss.js` +- `pc/postmessage.js` +- `pc/util.js` +- `pc/wgts/index.js` +- `wgts/index.js` +- `wgts/wgt_fullSlider/utils.js` +- `wgts/wgt_showcase/attr-item.vue` +- `wgts/wgt_slider/utils.js` diff --git a/.cursor/skills/i18n-translate/plans/src_view_decorate_wgts_wgt_slider.md b/.cursor/skills/i18n-translate/plans/src_view_decorate_wgts_wgt_slider.md new file mode 100644 index 0000000..fd50ef4 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_decorate_wgts_wgt_slider.md @@ -0,0 +1,33 @@ +# i18n 计划:view/decorate/wgts/wgt_slider + +**扫描目录**: `src/view/decorate/wgts/wgt_slider` +**计划文件**: `src_view_decorate_wgts_wgt_slider.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|----------|------|--------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 5 | 100% | +| 无需翻译 | 1 | (scss) | +| **合计** | 6 | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `sliderDialog.vue` +- `index.vue` +- `attr-item.vue` +- `config.js` +- `utils.js` + +## 无需翻译 + +- `index.scss` + +## 说明 + +本目录为 decorate 下 wgt_slider 组件专项计划。父计划 `src_view_decorate.md` 已将该目录下文件列入已翻译;本次对 `sliderDialog.vue` 中剩余中文(「封面图」「单位为 %」)补全 i18n,并创建本计划以记录进度。当前目录已全部翻译完成。 diff --git a/.cursor/skills/i18n-translate/plans/src_view_financial.md b/.cursor/skills/i18n-translate/plans/src_view_financial.md new file mode 100644 index 0000000..6061499 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_financial.md @@ -0,0 +1,42 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/financial` +**报告文件**: `src_view_financial.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 19 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **19** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `invoice/constants.js` +- `invoice/list.vue` +- `invoice/listSchema.js` +- `invoice/setting.vue` +- `invoice/settingSchema.js` +- `invoice/process.vue` +- `invoice/detail.vue` +- `invoice/detailSchema.js` +- `invoice/information.vue` +- `invoice/informationSchema.js` +- `invoice/invoiceConfirmation.vue` +- `invoice/invoiceConfirmationSchema.js` +- `invoice/invoiceTax.vue` +- `invoice/invoiceTaxSchema.js` +- `settlement/summary.vue` +- `settlement/detailed.vue` +- `settlement/configure.vue` +- `settlement/components/SettlementCycle.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_goods.md b/.cursor/skills/i18n-translate/plans/src_view_goods.md new file mode 100644 index 0000000..1244aad --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_goods.md @@ -0,0 +1,32 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/goods` +**报告文件**: `src_view_goods.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 8 | 88.9% | +| 无需翻译 | 1 | 11.1% | +| **合计** | **9** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `arrivalNotice.vue` +- `mainCategory.vue` +- `rate.vue` +- `saleCategory.vue` +- `components/GoodsParams.vue` +- `components/SpecParams.vue` +- `components/SkuParams.vue` +- `index.vue` + +## 无需翻译 + +- `list.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_guide.md b/.cursor/skills/i18n-translate/plans/src_view_guide.md new file mode 100644 index 0000000..c5910b2 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_guide.md @@ -0,0 +1,38 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/guide` +**报告文件**: `src_view_guide.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 14 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **14** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `children.vue` +- `shopnoticetempl.vue` +- `SalemanLoginHistory.vue` +- `shoppingGuideTaskStatistics.vue` +- `salesman_relationship.vue` +- `shopactivities.vue` +- `shopActivities_editor.vue` +- `salemanRoleConfig.vue` +- `salemanCustomerComplaints.vue` +- `salesman.vue` +- `shoppingGuideTask.vue` +- `shoppingGuideTask_editor.vue` +- `shoppingguidenotification.vue` +- `shoppingguidenotification_editor.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_mall.md b/.cursor/skills/i18n-translate/plans/src_view_mall.md new file mode 100644 index 0000000..e287774 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_mall.md @@ -0,0 +1,290 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/mall` +**报告文件**: `src_view_mall.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 255 | 95.5% | +| 无需翻译 | 12 | 4.5% | +| **合计** | **267** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `accountopeninfo/index.vue` +- `aftersales/detail.vue` +- `aftersales/financial/list.vue` +- `aftersales/list.vue` +- `aftersales/reason.vue` +- `aftersales/refundDetail.vue` +- `aftersales/refundList/components/order.vue` +- `aftersales/refundList/components/orderlog.vue` +- `bspay_sub_account/detail.vue` +- `bspay_sub_account/finder/audit_setting.js` +- `bspay_sub_account/finder/setting.js` +- `bspay_sub_account/sub_account.vue` +- `bspay_sub_account/withdraw.vue` +- `bspay_sub_account/withdraw_audit.vue` +- `chinaums/divisionList/components/transfer.vue` +- `chinaums/divisionList/components/transferdetail.vue` +- `chinaums/divisionList/components/transferlog.vue` +- `community/achievement.vue` +- `community/activityList.vue` +- `community/chief.vue` +- `community/chiefApprove.vue` +- `community/chiefDetail.vue` +- `community/chiefInfo.vue` +- `community/communitygoods.vue` +- `community/comps/invitationCode.vue` +- `community/setting.vue` +- `community/withdraw.vue` +- `datacube/accountingstatistics.vue` +- `datacube/cashrecord.vue` +- `datacube/companydata.vue` +- `datacube/companydata/delivery.vue` +- `datacube/companydata/ledgerinfo.vue` +- `datacube/companydata/member.vue` +- `datacube/companydata/order.vue` +- `datacube/companydata/orderinfo.vue` +- `datacube/companydata/refundinfo.vue` +- `datacube/distributordata.vue` +- `datacube/goodsdata.vue` +- `fapiao/add.vue` +- `fapiao/detail.vue` +- `fapiao/list.vue` +- `fapiao/set.vue` +- `goods/attributes/attributes.vue` +- `goods/attributes/brand.vue` +- `goods/attributes/goodsattributes.vue` +- `goods/attributes/params.vue` +- `goods/audit/add.vue` +- `goods/audit/comps/CmBaseForm.vue` +- `goods/audit/comps/CmGoodsParams.vue` +- `goods/audit/comps/CmSkuForm.vue` +- `goods/audit/comps/goodsSelect/index.vue` +- `goods/audit/list.vue` +- `goods/category.vue` +- `goods/distributortags.vue` +- `goods/hotkeywords.vue` +- `goods/maincategory.vue` +- `goods/physical/add.standard.vue` +- `goods/physical/add.vue` +- `goods/physical/comps/CmBaseForm.vue` +- `goods/physical/comps/CmGoodsParams.vue` +- `goods/physical/comps/CmSkuForm.vue` +- `goods/physical/comps/goodsSelect/index.vue` +- `goods/physical/comps/skuFinder.vue` +- `goods/physical/list.standard.vue` +- `goods/physical/list.vue` +- `goods/physical/normalGoodsProfitUpload.vue` +- `goods/physical/normalGoodsStoreUpload.vue` +- `goods/physical/normalGoodsTagUpload.vue` +- `goods/physical/normalGoodsUpload.vue` +- `goods/physical/schema.js` +- `goods/physical/supplier_goods_check.vue` +- `goods/physical/supplier_goods_list.vue` +- `goods/physical/tags.vue` +- `goods/ranking/index.vue` +- `goods/service/index.vue` +- `goods/service/items/add.vue` +- `goods/service/items/list.vue` +- `goods/service/servicelabels/list.vue` +- `goods/tags.vue` +- `liveroom/list.vue` +- `liveroom/replay.vue` +- `marketing/basicSetting.vue` +- `marketing/component/AddShipModal.vue` +- `marketing/component/InfoTipModal.vue` +- `marketing/component/RemoveShipModal.vue` +- `marketing/component/editAccount.vue` +- `marketing/dealer/AddModal.vue` +- `marketing/dealer/detail.vue` +- `marketing/dealer/index.vue` +- `marketing/dealer/relationstorelist.vue` +- `marketing/dealer/storelist.vue` +- `marketing/dealer_accountopen.vue` +- `marketing/distributionLog.vue` +- `marketing/distributionOrders.vue` +- `marketing/distributor.vue` +- `marketing/distributorAftersalesAddress.vue` +- `marketing/distributorCode.vue` +- `marketing/distributorInvoice.vue` +- `marketing/distributorRelItems.vue` +- `marketing/distributor_alipaysetting.vue` +- `marketing/distributor_details.vue` +- `marketing/distributor_editor/components/BaseForm.vue` +- `marketing/distributor_editor/components/DadaForm.vue` +- `marketing/distributor_editor/components/FashionForm.vue` +- `marketing/distributor_editor/components/ImageForm.vue` +- `marketing/distributor_editor/components/IntroduceForm.vue` +- `marketing/distributor_editor/components/ReturnGoodsForm.vue` +- `marketing/distributor_editor/components/ShopForm.vue` +- `marketing/distributor_editor/index.vue` +- `marketing/distributor_wxpaysetting.vue` +- `marketing/distributortags.vue` +- `marketing/huifuBspay/approve.vue` +- `marketing/huifuBspay/component/AccountInfo.vue` +- `marketing/huifuBspay/component/RegisterInfo.vue` +- `marketing/huifuBspay/component/StoreModal.vue` +- `marketing/huifuBspay/index.vue` +- `marketing/logByDistributor.vue` +- `marketing/merchantAccount/index.vue` +- `marketing/merchantAccount/setting.js` +- `marketing/merchantList/editor.vue` +- `marketing/merchantList/index.vue` +- `marketing/merchantList/setting/setting.js` +- `marketing/merchantVerify/index.vue` +- `marketing/openingapproval/approve.vue` +- `marketing/openingapproval/component/AccountInfo.vue` +- `marketing/openingapproval/component/RegisterInfo.vue` +- `marketing/openingapproval/component/StoreModal.vue` +- `marketing/openingapproval/index.vue` +- `marketing/productUpdate.vue` +- `marketing/salesmanwithdraw.vue` +- `marketing/setting/cpn/base.vue` +- `marketing/setting/cpn/classify.vue` +- `marketing/setting/index.vue` +- `marketing/shopUpload.vue` +- `marketing/shops/edit.vue` +- `marketing/shops/lists.vue` +- `marketing/storewhitelist.vue` +- `marketing/storewhitelistUpload.vue` +- `marketing/surveillance.vue` +- `marketing/transactionStatistics/index.vue` +- `marketing/withdraw.vue` +- `pointsmallgoods/attributes/attributes.vue` +- `pointsmallgoods/attributes/brand.vue` +- `pointsmallgoods/attributes/params.vue` +- `pointsmallgoods/category.vue` +- `pointsmallgoods/maincategory.vue` +- `pointsmallgoods/physical/tags.vue` +- `pointsmalltrade/cartadsetting.vue` +- `pointsmalltrade/list.vue` +- `pointsmalltrade/logistics.vue` +- `pointsmalltrade/normalorders/drugList.vue` +- `pointsmalltrade/normalorders/ordersupload.vue` +- `pointsmalltrade/normalorders/shopList.vue` +- `pointsmalltrade/omsqueuelog.vue` +- `pointsmalltrade/order/list.vue` +- `pointsmalltrade/ordersetting.vue` +- `pointsmalltrade/rate/list.vue` +- `pointsmalltrade/refunderrorlogs.vue` +- `pointsmalltrade/salesmanWorkRecords.vue` +- `pointsmalltrade/shipping/add.vue` +- `pointsmalltrade/shipping/templates.vue` +- `pointsmalltrade/shipping/templates/buyerTemplates.vue` +- `pointsmalltrade/shipping/templates/numberTemplates.vue` +- `pointsmalltrade/shipping/templates/priceTemplates.vue` +- `pointsmalltrade/shipping/templates/volumeTemplates.vue` +- `pointsmalltrade/shipping/templates/weightTemplates.vue` +- `profit/list.vue` +- `reservation/resourcesetting/add.vue` +- `reservation/resourcesetting/index.vue` +- `reservation/resourcesetting/list.vue` +- `reservation/resourcesetting/reservation.vue` +- `reservation/resourcesetting/workshift.vue` +- `reservation/setting/index.vue` +- `splitbill/applytype/corp.vue` +- `splitbill/applytype/solo.vue` +- `splitbill/applytype/user.vue` +- `splitbill/edit.vue` +- `splitbill/list.vue` +- `splitbill/platformAccount.vue` +- `splitbill/setting.vue` +- `splitbill/storeAccount.vue` +- `splitbill/storesetting.vue` +- `storeddeposit/index.vue` +- `storeddeposit/rechargeagreement.vue` +- `storeddeposit/rechargemultiple.vue` +- `storeddeposit/storageranking.vue` +- `storeddeposit/storedvalue.vue` +- `storeddeposit/totalview.vue` +- `storeddeposit/transactionrecord.vue` +- `storeshop/comps/skuFinder.vue` +- `storeshop/relmalllist.vue` +- `storeshop/shopselftlist.vue` +- `storeshop/store-shop.standard.vue` +- `sub_account/detail.vue` +- `sub_account/sub_account.vue` +- `subdistrict/list.vue` +- `supplier/supplier_list.vue` +- `supplier/supplier_orders.vue` +- `templatesetting/index.vue` +- `templatesetting/table.vue` +- `trade/cartadsetting.vue` +- `trade/examineTransfer.vue` +- `trade/examineTransferLogs.vue` +- `trade/financial/list.vue` +- `trade/list.vue` +- `trade/logistics copy.vue` +- `trade/logistics.vue` +- `trade/normalorders/communityList.vue` +- `trade/normalorders/components/ListActionButton.vue` +- `trade/normalorders/components/ListCancelAuditDialog.vue` +- `trade/normalorders/components/ListCancelOrderDialog.vue` +- `trade/normalorders/components/ListDeliveryDialog.vue` +- `trade/normalorders/components/ListFilterCard.vue` +- `trade/normalorders/components/ListTable.vue` +- `trade/normalorders/components/ListWriteoffOrder.vue` +- `trade/normalorders/components/comp-receiveInfo.vue` +- `trade/normalorders/components/comp-tableview.vue` +- `trade/normalorders/drugList.vue` +- `trade/normalorders/list.supplier.vue` +- `trade/normalorders/list.vue` +- `trade/normalorders/ordersupload.vue` +- `trade/normalorders/prepList.vue` +- `trade/normalorders/shopList.vue` +- `trade/omsqueuelog.vue` +- `trade/order/afterSale.vue` +- `trade/order/comps/comp-goodsList.vue` +- `trade/order/comps/comp-refundAmount.vue` +- `trade/order/comps/comp-refundFreight.vue` +- `trade/order/comps/comp-refundPoint.vue` +- `trade/order/detail/component/BaseCard.vue` +- `trade/order/detail/component/CustomCard.vue` +- `trade/order/detail/component/DiscountCard.vue` +- `trade/order/detail/component/GoodCard.vue` +- `trade/order/detail/component/LogisticsCard.vue` +- `trade/order/detail/component/PayCard.vue` +- `trade/order/detail/component/ProfitCard.vue` +- `trade/order/detail/detail copy.vue` +- `trade/order/detail/detail.vue` +- `trade/order/detail/index.vue` +- `trade/order/list.vue` +- `trade/order/logistics.vue` +- `trade/order/process.vue` +- `trade/refunderrorlogs.vue` +- `trade/salesmanWorkRecords.vue` +- `trade/shipping/add.vue` +- `trade/shipping/templates.vue` +- `trade/shipping/templates/buyerTemplates.vue` +- `trade/shipping/templates/numberTemplates.vue` +- `trade/shipping/templates/priceTemplates.vue` +- `trade/shipping/templates/volumeTemplates.vue` +- `trade/shipping/templates/weightTemplates.vue` +- `withdraw/cpn/table.vue` +- `withdraw/finder/setting.js` +- `withdraw/withdraw.vue` +- `withdraw/withdraw_setting.vue` + +## 无需翻译 + +- `aftersales/refundList/index.vue` +- `chinaums/divisionList/index.vue` +- `datacube/accountingstatistics_detail.vue` +- `goods/physical/comps/editText.vue` +- `marketing/component/BaseModal.vue` +- `marketing/distributor_template.vue` +- `marketing/huifuBspay/component/drawer.vue` +- `marketing/merchantVerify/verify.vue` +- `marketing/openingapproval/component/drawer.vue` +- `marketing/shopDecoration.vue` +- `splitbill/view.vue` +- `storeshop/itemlist.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_marketing.md b/.cursor/skills/i18n-translate/plans/src_view_marketing.md new file mode 100644 index 0000000..303e1bd --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_marketing.md @@ -0,0 +1,34 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/marketing` +**报告文件**: `src_view_marketing.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 10 | 100.0% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **10** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `employee/addGoods.vue` +- `employee/dependents.vue` +- `employee/list.vue` +- `employee/purchase.vue` +- `employee/result.vue` +- `lottery/constants.js` +- `lottery/editor.vue` +- `lottery/editorSchema.js` +- `lottery/list.vue` +- `lottery/schema.js` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_member.md b/.cursor/skills/i18n-translate/plans/src_view_member.md new file mode 100644 index 0000000..b9fbd81 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_member.md @@ -0,0 +1,180 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/member` +**报告文件**: `src_view_member.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 156 | 99.4% | +| 无需翻译 | 2 | 1.3% | +| **合计** | **157** | 100% | + +## 未翻译完 + +- 无 + +## 已翻译 + +- `ugc/ugcIndex.vue` +- `ugc/ugcNotesEditor.vue` +- `ugc/ugcPoint.vue` +- `ugc/ugcReview.vue` +- `ugc/ugcTags.vue` +- `ugc/ugcTopic.vue` +- `whitelist/list.vue` +- `whitelist/list.purchase.vue` +- `whitelist/uploadeindex.vue` +- `promotions/index.vue` +- `promotions/goodslimit/add.vue` +- `promotions/goodslimit/list.vue` +- `promotions/fullminus/add.vue` +- `promotions/fullminus/list.vue` +- `promotions/fullgift/add.vue` +- `promotions/fullgift/list.vue` +- `promotions/fulldiscount/add.vue` +- `promotions/fulldiscount/list.vue` +- `promotions/limitedtimesale/add.vue` +- `promotions/limitedtimesale/list.vue` +- `promotions/luckydraw/add.vue` +- `promotions/luckydraw/index.vue` +- `promotions/luckydraw/list/luckyDrawList.vue` +- `promotions/luckydraw/list/teamList.vue` +- `promotions/luckydraw/luckydrawrule.vue` +- `promotions/luckydraw/luckydrawshow.vue` +- `promotions/luckydraw/team.vue` +- `promotions/luckydraw/teamDetail.vue` +- `promotions/memberpreference/add.vue` +- `promotions/memberpreference/list.vue` +- `promotions/package/add.vue` +- `promotions/package/list.vue` +- `promotions/pluspricebuy/add.vue` +- `promotions/pluspricebuy/list.vue` +- `promotions/point.vue` +- `promotions/pointupvaluation/add.vue` +- `promotions/pointupvaluation/list.vue` +- `promotions/seckill/add.vue` +- `promotions/seckill/list.vue` +- `promotions/specificcrowd/specificcrowddiscount.vue` +- `promotions/specificcrowd/userdiscoutlog.vue` +- `promotions/wheel/index.vue` +- `purchase/company.vue` +- `purchase/employee.vue` +- `purchase/employeeImport.vue` +- `register.vue` +- `salemanprotocol.vue` +- `selfservice/activityverifylist.vue` +- `selfservice/components/enterpriseDialog.vue` +- `selfservice/formsettingadd.vue` +- `selfservice/formsettinglist.vue` +- `selfservice/formtemplateadd.vue` +- `selfservice/formtemplatelist.vue` +- `selfservice/index.vue` +- `selfservice/regRecordUpload.vue` +- `selfservice/registrationactivity.vue` +- `selfservice/registrationactivityadd.vue` +- `selfservice/registrationrecord.vue` +- `selfservice/registrationrecordetail.vue` +- `selfservice/templatepreview.vue` +- `selfservice/userdaliyrecord.vue` +- `trustlogin/list.vue` +- `ugc/comps/auditNote.vue` +- `ugc/comps/auditStatus.vue` +- `ugc/comps/flagModal.vue` +- `ugc/comps/flaglist.vue` +- `ugc/comps/noteslist.vue` +- `ugc/comps/reviewlist.vue` +- `ugc/comps/sensitivelist.vue` +- `ugc/comps/settingOfficial.vue` +- `ugc/comps/taglist.vue` +- `ugc/comps/topicModal.vue` +- `ugc/comps/topiclist.vue` +- `ugc/comps/viewNotes.vue` +- `ugc/comps/viewReview.vue` +- `ugc/ugcCase.vue` +- `ugc/ugcFlags.vue` +- `promotions/purchase/dependents.vue` +- `promotions/purchase/detail.vue` +- `promotions/purchase/editor.vue` +- `promotions/purchase/index.vue` +- `promotions/recommendlike.vue` +- `promotions/register.vue` +- `promotions/saleMemberCard.vue` +- `activity/add.vue` +- `activity/index.vue` +- `activity/templ.vue` +- `bargain/index.vue` +- `cardticket/coupon/gift.vue` +- `cardticket/coupon/giftEdit.vue` +- `bargain/add.vue` +- `cardticket/couponGrantSet.vue` +- `cardticket/couponspackage/cpn/table.vue` +- `cardticket/couponspackage/detail.vue` +- `cardticket/couponspackage/editor.vue` +- `cardticket/couponspackage/index.vue` +- `cardticket/detail.vue` +- `cardticket/detail/receive.vue` +- `cardticket/detail/used.vue` +- `coupon/giveErrorLog.vue` +- `coupon/giveLog.vue` +- `comps/cpLevel.vue` +- `comps/cpViplevel.vue` +- `groups/index.vue` +- `groups/list/groupsList.vue` +- `groups/list/teamList.vue` +- `cardticket/edit.vue` +- `cardticket/info.vue` +- `groups/add.vue` +- `promotions/community/add.vue` +- `promotions/community/activity/add.vue` +- `promotions/community/activity/list.vue` +- `promotions/community/activity/orderList.vue` +- `promotions/community/activityList.vue` +- `promotions/community/index.vue` +- `promotions/community/deliverydetail.vue` +- `promotions/community/deliveryorder.vue` +- `promotions/community/list.vue` +- `promotions/community/points.vue` +- `promotions/community/setting.vue` +- `promotions/community/withdraw.vue` +- `promotions/distributorEdit.vue` +- `promotions/distributorIndex.vue` +- `promotions/extrapoint/editor.vue` +- `promotions/extrapoint/list.vue` +- `promotions/extrapoint/templ.vue` +- `groups/team.vue` +- `groups/teamDetail.vue` +- `level.vue` +- `membercard/cpn/model.vue` +- `membercard/list.vue` +- `membercard/setting.vue` +- `point/index.vue` +- `point/overview.vue` +- `point/pointrecord.vue` +- `point/totalview.vue` +- `members/checkinList.vue` +- `members/comps/chuZhiList.vue` +- `members/comps/memberCardList.vue` +- `members/comps/pointList.vue` +- `members/depositlist.vue` +- `members/analysisrightsContent.vue` +- `members/detail.vue` +- `members/enterprise.vue` +- `members/memberinfo.vue` +- `members/orderlist.vue` +- `members/quanyilist.vue` +- `members/rightsList.vue` +- `members/rightsloglist.vue` +- `members/salespersonLogsList.vue` +- `members/tagcategory.vue` +- `members/upload_chief.vue` +- `members/uploade.vue` +- `members/tags.vue` +- `members/transferlist.vue` + +## 无需翻译 + +- `cardticket/coupon.vue` +- `promotions/community/activity/index.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_menus.md b/.cursor/skills/i18n-translate/plans/src_view_menus.md new file mode 100644 index 0000000..1fcb3b6 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_menus.md @@ -0,0 +1,28 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/menus` +**报告文件**: `src_view_menus.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 4 | 100.0% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **4** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `distributormenu.vue` +- `merchantmenu.vue` +- `shopmenu.vue` +- `supplier.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_merchant.md b/.cursor/skills/i18n-translate/plans/src_view_merchant.md new file mode 100644 index 0000000..3d0e67b --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_merchant.md @@ -0,0 +1,28 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/merchant` +**报告文件**: `src_view_merchant.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 4 | 80.0% | +| 无需翻译 | 1 | 20.0% | +| **合计** | **5** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `components/DaoDianZiti.vue` +- `components/RefundGoodsAddress.vue` +- `components/RefundGoodsStore.vue` +- `store.vue` + +## 无需翻译 + +- `storeList.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_order.md b/.cursor/skills/i18n-translate/plans/src_view_order.md new file mode 100644 index 0000000..7ecdf0e --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_order.md @@ -0,0 +1,30 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/order` +**报告文件**: `src_view_order.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 6 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **6** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `tradeSetting.vue` +- `orderSetting.vue` +- `entitytrade/comps/comp-receiveInfo.vue` +- `entitytrade/comps/comp-tableview.vue` +- `entitytrade/list.vue`(筛选、表头、操作列、导出/批量操作已译;弹窗与表单 schema 已译) +- `entitytrade/purchase.vue`(筛选、表格、弹窗、表单、操作按钮及消息已全部 i18n) + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_pc.md b/.cursor/skills/i18n-translate/plans/src_view_pc.md new file mode 100644 index 0000000..4ba00df --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_pc.md @@ -0,0 +1,75 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/pc` +**报告文件**: `src_view_pc.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 34 | 65.4% | +| 无需翻译 | 18 | 34.6% | +| **合计** | **52** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `custompage.vue` +- `custompage/default.vue` +- `custompage/components/common/Footer.vue` +- `custompage/components/common/Header.vue` +- `pctemplate/index.vue` +- `custompage/components/common/Nav.vue` +- `pctemplate/login.vue` +- `custompage/components/common/YButton.vue` +- `custompage/components/plugins/floor/index.vue` +- `footerPage/default.vue` +- `custompage/components/plugins/floor/style.vue` +- `custompage/components/plugins/goodsGrid/index.vue` +- `tdk/givenset.vue` +- `tdk/globalset.vue` +- `custompage/components/plugins/imgHotzone/style.vue` +- `custompage/components/plugins/nav/style.vue` +- `custompage/components/plugins/panel/style.vue` +- `custompage/pluginscomponents/ProductMap.vue` +- `footerPage/components/plugins/footer/style.vue` +- `homePage/components/common/Footer.vue` +- `homePage/default.vue` +- `homePage/components/common/Header.vue` +- `homePage/components/common/Nav.vue` +- `homePage/components/common/YButton.vue` +- `homePage/components/plugins/floor/index.vue` +- `homePage/components/plugins/goodsGrid/index.vue` +- `homePage/components/plugins/imgHotzone/style.vue` +- `homePage/components/plugins/nav/style.vue` +- `homePage/components/plugins/panel/style.vue` +- `homePage/components/plugins/settings/style.vue` +- `vipPage/components/plugins/poster/style.vue` +- `vipPage/default.vue` +- `homePage/components/plugins/floor/style.vue` +- `homePage/pluginscomponents/ProductMap.vue` + +## 无需翻译 + +- `custompage/components/common/index.js` +- `custompage/components/plugins/banner/index.vue` +- `custompage/components/plugins/banner/style.vue` +- `custompage/components/plugins/goodsGrid/style.vue` +- `custompage/components/plugins/imgHotzone/index.vue` +- `custompage/components/plugins/index.js` +- `custompage/components/plugins/panel/index.vue` +- `footerPage/components/plugins/footer/index.vue` +- `footerPage/components/plugins/index.js` +- `homePage/components/common/index.js` +- `homePage/components/plugins/banner/index.vue` +- `homePage/components/plugins/banner/style.vue` +- `homePage/components/plugins/goodsGrid/style.vue` +- `homePage/components/plugins/imgHotzone/index.vue` +- `homePage/components/plugins/index.js` +- `homePage/components/plugins/panel/index.vue` +- `vipPage/components/plugins/index.js` +- `vipPage/components/plugins/poster/index.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_view_popularize.md b/.cursor/skills/i18n-translate/plans/src_view_popularize.md new file mode 100644 index 0000000..4b25fd9 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_popularize.md @@ -0,0 +1,36 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/popularize` +**报告文件**: `src_view_popularize.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 12 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **12** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `goods.vue` +- `goodsAudit.vue` +- `goodsStore.vue` +- `promoterSetting.vue` +- `children.vue` +- `taskBrokerage.vue` +- `taskBrokerageCount.vue` +- `brokerageLog.vue` +- `data.vue` +- `list.vue` +- `withdraw.vue` +- `setting.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_regionauth.md b/.cursor/skills/i18n-translate/plans/src_view_regionauth.md new file mode 100644 index 0000000..c0a7e44 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_regionauth.md @@ -0,0 +1,25 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/regionauth` +**报告文件**: `src_view_regionauth.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 1 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **1** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `list.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_shop.md b/.cursor/skills/i18n-translate/plans/src_view_shop.md new file mode 100644 index 0000000..52e48d5 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_shop.md @@ -0,0 +1,27 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/shop` +**报告文件**: `src_view_shop.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 3 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **3** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `editstore.vue` +- `goods/companygoods.vue` +- `storelist.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_shopscreen.md b/.cursor/skills/i18n-translate/plans/src_view_shopscreen.md new file mode 100644 index 0000000..2caa651 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_shopscreen.md @@ -0,0 +1,28 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/shopscreen` +**报告文件**: `src_view_shopscreen.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 4 | 100% | +| 无需翻译 | 0 | 0.0% | +| **合计** | **4** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `bigScreenAd.vue` +- `category.vue` +- `homeCarousel.vue` +- `searchKeyWords.vue` + +## 无需翻译 + +(无) diff --git a/.cursor/skills/i18n-translate/plans/src_view_wxapp.md b/.cursor/skills/i18n-translate/plans/src_view_wxapp.md new file mode 100644 index 0000000..b0d9ef9 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_view_wxapp.md @@ -0,0 +1,106 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/view/wxapp` +**报告文件**: `src_view_wxapp.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0.0% | +| 已翻译 | 76 | 91.6% | +| 无需翻译 | 12 | 14.5% | +| **合计** | **83** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `aliapp/authorize/index.vue` +- `aliapp/cartremind.vue` +- `aliapp/color_style.vue` +- `aliapp/floor_guide.vue` +- `aliapp/category.vue` +- `aliapp/custompage.vue` +- `aliapp/index.vue` +- `aliapp/messages.vue` +- `aliapp/salespersonshelfindex.vue` +- `aliapp/statistics/dataanalysis/access.vue` +- `aliapp/statistics/dataanalysis/index.vue` +- `aliapp/statistics/dataanalysis/survey.vue` +- `aliapp/statistics/dataanalysis/user.vue` +- `aliapp/statistics/sourcemanagement/index.vue` +- `aliapp/statistics/sourcemanagement/monito_detail.vue` +- `aliapp/statistics/sourcemanagement/monito_list.vue` +- `aliapp/statistics/sourcemanagement/source_list.vue` +- `aliapp/template.vue` +- `aliapp/template/apple/default.vue` +- `aliapp/template/mall/baDefault.vue` +- `aliapp/template/mall/community.vue` +- `aliapp/template/mall/community_management.vue` +- `aliapp/template/mall/default copy.vue` +- `aliapp/template/marketing/group.vue` +- `aliapp/template/store/default.vue` +- `aliapp/template/store/sport.vue` +- `aliapp/template/store/universal.vue` +- `aliminiapp/setting.vue` +- `authorize/index.vue` +- `authorize/policy.vue` +- `cartremind.vue` +- `category/addCartas.vue` +- `category/categorize.vue` +- `category/index.vue` +- `category/list.vue` +- `classificationTemplate/index.vue` +- `customPage/index.vue` +- `floor_guide.vue` +- `home/consts/index.js` +- `home/index.vue` +- `index.vue` +- `manage/activitycollection/index.vue` +- `memberCenter/comps/banner.vue` +- `memberCenter/comps/menuoption.vue` +- `memberCenter/comps/redirect.vue` +- `memberCenter/comps/share.vue` +- `memberCenter/index.vue` +- `member_center_setting.vue` +- `messages.vue` +- `salespersonshelfindex.vue` +- `shopInfo/index.vue` +- `statistics/dataanalysis/access.vue` +- `statistics/dataanalysis/index.vue` +- `statistics/dataanalysis/survey.vue` +- `statistics/dataanalysis/user.vue` +- `statistics/sourcemanagement/index.vue` +- `statistics/sourcemanagement/monito_detail.vue` +- `statistics/sourcemanagement/monito_list.vue` +- `statistics/sourcemanagement/source_list.vue` +- `template.vue` +- `template/apple/default.vue` +- `template/mall/baDefault.vue` +- `template/mall/community.vue` +- `template/mall/community_management.vue` +- `template/marketing/group.vue` +- `template/store/default.vue` +- `template/store/sport.vue` +- `template/store/universal.vue` +- `theme/colorStyle.vue` +- `wxappmanage/list.vue` +- `wxappmanage/policy.vue` + +## 无需翻译 + +- `aliapp/bamanagement.vue` +- `aliapp/cartremindmanagement.vue` +- `aliapp/management.vue` +- `aliapp/template/index.vue` +- `aliapp/template/mall/default.vue` +- `aliapp/template/marketing/card.vue` +- `bamanagement.vue` +- `cartremindmanagement.vue` +- `management.vue` +- `template/index.vue` +- `template/mall/default.vue` +- `template/marketing/card.vue` diff --git a/.cursor/skills/i18n-translate/plans/src_views.md b/.cursor/skills/i18n-translate/plans/src_views.md new file mode 100644 index 0000000..c068b60 --- /dev/null +++ b/.cursor/skills/i18n-translate/plans/src_views.md @@ -0,0 +1,117 @@ +# i18n 扫描结果 + +**扫描目录**: `/Users/lukaijie/workspace/work/shopex/smallP/ecshopx-platform/ecshopx-admin/src/views` +**报告文件**: `src_views.md` + +## 统计 + +| 状态 | 数量 | 占比 | +|------|------|------| +| 未翻译完 | 0 | 0% | +| 已翻译 | 93 | 98.9% | +| 无需翻译 | 1 | 1.1% | +| **合计** | **94** | 100% | + +## 未翻译完 + +(无) + +## 已翻译 + +- `settings/deliverySettings/delivery-performance.vue` +- `settings/deliverySettings/logistics-inquiry.vue` +- `settings/deliverySettings/logistics/add-ziti.vue` +- `settings/deliverySettings/logistics/city.vue` +- `settings/deliverySettings/logistics/component/logisticsBlock.vue` +- `settings/deliverySettings/logistics/comps/form-item-appointdays.vue` +- `settings/deliverySettings/logistics/comps/form-item-appointziti.vue` +- `settings/deliverySettings/logistics/comps/form-item-connectphone.vue` +- `settings/deliverySettings/logistics/comps/form-item-timeslot.vue` +- `settings/deliverySettings/logistics/comps/form-item-zitiaddress.vue` +- `settings/deliverySettings/logistics/comps/zipei-list.vue` +- `settings/deliverySettings/logistics/comps/ziti-list.vue` +- `settings/deliverySettings/logistics/index.vue` +- `settings/deliverySettings/logistics/normal.vue` +- `settings/deliverySettings/logistics/shansong.vue` +- `settings/kujiale-setting.vue` +- `settings/role-admin.vue` +- `settings/systemConfig/ShangPai-erp.vue` +- `settings/systemConfig/authorityapproval/approve.vue` +- `settings/systemConfig/authorityapproval/component/PersonInfo.vue` +- `settings/systemConfig/authorityapproval/index.vue` +- `settings/systemConfig/damoCrm/index.vue` +- `settings/systemConfig/domain.vue` +- `settings/systemConfig/echat.vue` +- `settings/systemConfig/encrypt/authAdmin.vue` +- `settings/systemConfig/encrypt/setting/authAdmin.js` +- `settings/systemConfig/extMiniLinkDetail.vue` +- `settings/systemConfig/external-app.vue` +- `settings/systemConfig/invoiceConfiguration/baiSetting.vue` +- `settings/systemConfig/invoiceConfiguration/baiSettingSchema.js` +- `settings/systemConfig/jstSetting.vue` +- `settings/systemConfig/map-setting.vue` +- `settings/systemConfig/meiqia.vue` +- `settings/systemConfig/official-account-auth.vue` +- `settings/systemConfig/payment.vue` +- `settings/systemConfig/publicsetting.vue` +- `settings/systemConfig/smsService/ali_sms.vue` +- `settings/systemConfig/smsService/base_config.vue` +- `settings/systemConfig/smsService/send_sms.vue` +- `settings/systemConfig/smsService/shopex_sms.vue` +- `settings/systemConfig/smsService/sms_MassLog.vue` +- `settings/systemConfig/smsService/sms_MassLog_edit.vue` +- `settings/systemConfig/smsService/sms_sendLog.vue` +- `settings/systemConfig/smsService/sms_signatures.vue` +- `settings/systemConfig/smsService/sms_signatures_edit.vue` +- `settings/systemConfig/smsService/sms_template.vue` +- `settings/systemConfig/smsService/sms_template_edit.vue` +- `settings/systemConfig/ugcTPOS.vue` +- `settings/systemConfig/wdtSetting.vue` +- `settings/systemConfig/webPrivacyStatement.vue` +- `settings/systemConfig/wxapp-customer-service.vue` +- `settings/systemConfig/yilianyun/index.vue` +- `settings/systemConfig/yilianyun/setting.vue` +- `settings/systemConfig/yilianyun/shop.vue` +- `settings/systemInfo/operation-log.vue` +- `store/shop-list.vue` +- `store/storeRules/components/rules-list.vue` +- `store/storeRules/store-rules.vue` +- `core/fallback/not-found.vue` +- `core/account-activation.vue` +- `content/aterialmanagement.vue` +- `dashboard/index.vue` +- `applications/kujiale/list.vue` +- `core/authentication/login.vue` +- `dashboard/merchant-dashboard.vue` +- `core/authentication/merchant-login.vue` +- `core/authentication/shop-login.vue` +- `core/upload/upload-chief.vue` +- `core/authentication/shuyun-login.vue` +- `core/authentication/supplier-login.vue` +- `financial/components/SettlementCycle.vue` +- `financial/configure_supplier.vue` +- `financial/detailed.vue` +- `financial/summary_supplier.vue` +- `marketing/autoMarketing/_id.vue` +- `marketing/autoMarketing/activity-list.vue` +- `marketing/autoMarketing/components/activity-daterange.vue` +- `marketing/autoMarketing/components/gift-coupon-list.vue` +- `marketing/autoMarketing/components/give-away-type.vue` +- `marketing/autoMarketing/components/sms-notice.vue` +- `members/components/CompAddTag.vue` +- `members/components/CompForm.vue` +- `members/components/CompTagList.vue` +- `members/components/CompTagsMore.vue` +- `members/crowd_marking.vue` +- `members/customer_tags.vue` +- `members/crowd_marking_editor.vue` +- `members/logout_member.vue` +- `members/config/member_list_schema.js` +- `members/member_list.vue` +- `members/register_member.vue` +- `settings/deliverySettings/dada-account.vue` +- `settings/deliverySettings/delivery-management.vue` + +## 无需翻译 + +- `core/authentication/agent-login.vue` diff --git a/.cursor/skills/i18n-translate/scripts/check_i18n_keys.py b/.cursor/skills/i18n-translate/scripts/check_i18n_keys.py new file mode 100755 index 0000000..99012ab --- /dev/null +++ b/.cursor/skills/i18n-translate/scripts/check_i18n_keys.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +"""Check i18n key usage against locale files. + +Scans src/ for $t('key') / this.$t('key') / i18n.t('key') usage and +compares with locale JSON files. Optionally removes unused keys. +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path + + +PATTERNS = [ + re.compile(r"\$t\(\s*['\"]([^'\"]+)['\"]"), + re.compile(r"this\.\$t\(\s*['\"]([^'\"]+)['\"]"), + re.compile(r"\bi18n\.t\(\s*['\"]([^'\"]+)['\"]"), +] + + +def collect_keys(src_dir: Path) -> set[str]: + keys: set[str] = set() + for path in src_dir.rglob("*"): + if not path.is_file(): + continue + if path.suffix not in {".vue", ".js", ".ts"}: + continue + try: + text = path.read_text(encoding="utf-8") + except Exception: + text = path.read_text() + for pat in PATTERNS: + keys.update(pat.findall(text)) + return keys + + +def load_locale_files(locales_dir: Path) -> dict[Path, dict]: + files = [] + # Prefer standard files if present + for name in ("zh-CN.json", "en.json", "ar.json"): + p = locales_dir / name + if p.exists(): + files.append(p) + if not files: + files = sorted(locales_dir.glob("*.json")) + locales = {} + for p in files: + try: + data = json.loads(p.read_text(encoding="utf-8")) + except Exception: + data = json.loads(p.read_text()) + locales[p] = data + return locales + + +def main() -> int: + parser = argparse.ArgumentParser(description="Check i18n key usage against locale files") + parser.add_argument("--src", default="src", help="Source dir to scan (default: src)") + parser.add_argument( + "--locales", + default="src/i18n/locales", + help="Locales dir containing json files (default: src/i18n/locales)", + ) + parser.add_argument( + "--list", + action="store_true", + help="Print full missing/unused key lists", + ) + parser.add_argument( + "--clean", + action="store_true", + help="Remove unused keys from locale files", + ) + parser.add_argument( + "--no-fail", + action="store_true", + help="Always exit 0 (even if missing keys exist)", + ) + args = parser.parse_args() + + src_dir = Path(args.src) + locales_dir = Path(args.locales) + + if not src_dir.exists(): + print(f"[error] src dir not found: {src_dir}", file=sys.stderr) + return 2 + if not locales_dir.exists(): + print(f"[error] locales dir not found: {locales_dir}", file=sys.stderr) + return 2 + + used_keys = collect_keys(src_dir) + locales = load_locale_files(locales_dir) + + print(f"used keys: {len(used_keys)}") + + any_missing = False + for loc_path, data in locales.items(): + keys = set(data.keys()) + missing = sorted(used_keys - keys) + unused = sorted(keys - used_keys) + + print(f"{loc_path.name}: missing={len(missing)} unused={len(unused)}") + if missing: + any_missing = True + if args.list: + if missing: + print(f"-- missing in {loc_path.name} --") + print("\n".join(missing)) + if unused: + print(f"-- unused in {loc_path.name} --") + print("\n".join(unused)) + + if args.clean and unused: + new_data = {k: data[k] for k in data.keys() if k in used_keys} + loc_path.write_text(json.dumps(new_data, ensure_ascii=False, indent=2, sort_keys=True)) + + if any_missing and not args.no_fail: + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.cursor/skills/i18n-translate/scripts/gen_i18n_key.py b/.cursor/skills/i18n-translate/scripts/gen_i18n_key.py new file mode 100755 index 0000000..b378b62 --- /dev/null +++ b/.cursor/skills/i18n-translate/scripts/gen_i18n_key.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +import argparse +import hashlib +import json +import sys + + +def _hash(text: str, length: int) -> str: + return hashlib.md5(text.encode("utf-8")).hexdigest()[:length] + + +def make_key(path: str, text: str) -> str: + key1 = _hash(path, 8) + key2 = _hash(text, 6) + return f"{key1}.{key2}" + + +def main() -> int: + parser = argparse.ArgumentParser(description="Generate i18n key from path and text") + parser.add_argument("--path", help="Source file path") + parser.add_argument("--text", help="Chinese text") + parser.add_argument("--jsonl", action="store_true", help="Read JSONL from stdin") + args = parser.parse_args() + + if args.jsonl: + for line in sys.stdin: + line = line.strip() + if not line: + continue + obj = json.loads(line) + path = obj.get("path", "") + text = obj.get("text", "") + obj["key"] = make_key(path, text) + sys.stdout.write(json.dumps(obj, ensure_ascii=False) + "\n") + return 0 + + path = args.path or "" + text = args.text + if text is None: + text = sys.stdin.read().strip() + if not path: + sys.stderr.write("--path is required\n") + return 2 + if not text: + sys.stderr.write("--text is required\n") + return 2 + + sys.stdout.write(make_key(path, text)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.cursor/skills/i18n-translate/scripts/scan_i18n_status.py b/.cursor/skills/i18n-translate/scripts/scan_i18n_status.py new file mode 100644 index 0000000..a3d11ef --- /dev/null +++ b/.cursor/skills/i18n-translate/scripts/scan_i18n_status.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +"""Scan directory for i18n translation status. + +For each file (excluding comment content): +- Contains Chinese -> 未翻译完 +- No Chinese and contains $t( -> 已翻译 +- Otherwise -> 无需翻译 + +Generates a report in .cursor/skills/i18n-translate/plans/{path_slug}.md +""" + +from __future__ import annotations + +import argparse +import re +import sys +from pathlib import Path + +# File extensions to scan (same as check_i18n_keys) +DEFAULT_EXTENSIONS = (".vue", ".js", ".ts", ".jsx", ".tsx") + +# Chinese character range (CJK Unified Ideographs, common) +CHINESE_RE = re.compile(r"[\u4e00-\u9fff\u3400-\u4dbf]") + +# $t( usage +T_METHOD_RE = re.compile(r"\$t\s*\(") + + +def strip_comments(content: str, ext: str) -> str: + """Remove comment parts so we don't count Chinese or $t in comments.""" + out = content + # Block comment: /* ... */ + out = re.sub(r"/\*[\s\S]*?\*/", " ", out) + # Line comment: // to EOL + out = re.sub(r"//[^\n]*", "\n", out) + # HTML/Vue template comment: + out = re.sub(r"", " ", out) + return out + + +def classify_file(file_path: Path, root: Path) -> str: + """Return '未翻译完' | '已翻译' | '无需翻译'.""" + try: + text = file_path.read_text(encoding="utf-8") + except Exception: + try: + text = file_path.read_text() + except Exception: + return "无需翻译" # unreadable + + code = strip_comments(text, file_path.suffix.lower()) + has_chinese = CHINESE_RE.search(code) is not None + has_t = T_METHOD_RE.search(code) is not None + + if has_chinese: + return "未翻译完" + if has_t: + return "已翻译" + return "无需翻译" + + +def path_to_slug(target_path: str) -> str: + """e.g. src/view/mall -> src_view_mall.""" + normalized = target_path.strip().strip("/") + if not normalized: + return "root" + return normalized.replace("/", "_").replace("\\", "_") + + +def scan_dir( + root: Path, + extensions: tuple[str, ...], + recursive: bool = True, +) -> dict[str, list[str]]: + """Scan root (and subdirs if recursive), return mapping status -> list of relative paths.""" + result: dict[str, list[str]] = { + "未翻译完": [], + "已翻译": [], + "无需翻译": [], + } + if recursive: + paths = root.rglob("*") + else: + paths = (p for p in root.iterdir() if p.is_file()) + for path in paths: + if not path.is_file(): + continue + if path.suffix.lower() not in extensions: + continue + try: + rel = path.relative_to(root) + except ValueError: + continue + rel_str = str(rel).replace("\\", "/") + status = classify_file(path, root) + result[status].append(rel_str) + for key in result: + result[key].sort() + return result + + +def write_report( + plans_dir: Path, + slug: str, + scan_root: Path, + result: dict[str, list[str]], +) -> Path: + """Write plans/{slug}.md and return the file path.""" + plans_dir.mkdir(parents=True, exist_ok=True) + report_path = plans_dir / f"{slug}.md" + total = sum(len(v) for v in result.values()) + lines = [ + "# i18n 扫描结果", + "", + f"**扫描目录**: `{scan_root}`", + f"**报告文件**: `{report_path.name}`", + "", + "## 统计", + "", + "| 状态 | 数量 | 占比 |", + "|------|------|------|", + ] + for status in ("未翻译完", "已翻译", "无需翻译"): + count = len(result[status]) + pct = f"{100 * count / total:.1f}%" if total else "0%" + lines.append(f"| {status} | {count} | {pct} |") + lines.append(f"| **合计** | **{total}** | 100% |") + lines.extend([ + "", + "## 未翻译完", + "", + ]) + if result["未翻译完"]: + for p in result["未翻译完"]: + lines.append(f"- `{p}`") + else: + lines.append("(无)") + lines.extend([ + "", + "## 已翻译", + "", + ]) + if result["已翻译"]: + for p in result["已翻译"]: + lines.append(f"- `{p}`") + else: + lines.append("(无)") + lines.extend([ + "", + "## 无需翻译", + "", + ]) + if result["无需翻译"]: + for p in result["无需翻译"]: + lines.append(f"- `{p}`") + else: + lines.append("(无)") + lines.append("") + report_path.write_text("\n".join(lines), encoding="utf-8") + return report_path + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Scan directory for i18n status and generate plans report", + ) + parser.add_argument( + "path", + nargs="?", + default="src", + help="Directory to scan (default: src). e.g. src/view/mall", + ) + parser.add_argument( + "--extensions", + default=",".join(DEFAULT_EXTENSIONS), + help=f"Comma-separated extensions (default: {','.join(DEFAULT_EXTENSIONS)})", + ) + parser.add_argument( + "--cwd", + default=".", + help="Project root (default: current dir). Scan path is relative to this.", + ) + parser.add_argument( + "--plans-dir", + default=None, + help="Plans output dir (default: .cursor/skills/i18n-translate/plans under cwd)", + ) + parser.add_argument( + "--no-report", + action="store_true", + help="Only print stats, do not write report file", + ) + parser.add_argument( + "--no-recursive", + action="store_true", + help="Only scan files directly in the given directory (no subdirs)", + ) + args = parser.parse_args() + + cwd = Path(args.cwd).resolve() + scan_root = (cwd / args.path).resolve() + if not scan_root.is_dir(): + print(f"[error] 目录不存在: {scan_root}", file=sys.stderr) + return 2 + + extensions = tuple(e.strip() for e in args.extensions.split(",") if e.strip()) + if not extensions: + extensions = DEFAULT_EXTENSIONS + + result = scan_dir(scan_root, extensions, recursive=not getattr(args, "no_recursive", False)) + total = sum(len(v) for v in result.values()) + + print(f"扫描目录: {scan_root}") + print(f"总文件数: {total}") + for status in ("未翻译完", "已翻译", "无需翻译"): + print(f" {status}: {len(result[status])}") + + if args.no_report: + return 0 + + plans_dir = Path(args.plans_dir) if args.plans_dir else (cwd / ".cursor" / "skills" / "i18n-translate" / "plans") + slug = path_to_slug(args.path) + report_path = write_report(plans_dir, slug, scan_root, result) + print(f"报告已写入: {report_path}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.cursor/todos/i18n_src_directory_todos.md b/.cursor/todos/i18n_src_directory_todos.md new file mode 100644 index 0000000..4528c0d --- /dev/null +++ b/.cursor/todos/i18n_src_directory_todos.md @@ -0,0 +1,63 @@ +# i18n src 目录 Todolist + + +## 第一优先级: view/ 目录 (948 文件) + +- [completed] **batch-1-1** — view/mall/ +- [completed] **batch-1-2** — view/member/ +- [completed] **batch-1-3** — view/decorate/ +- [completed] **batch-1-4** — view/base/ +- [completed] **batch-1-5** — view/wxapp/ +- [completed] **batch-1-6** — view/pc/ +- [completed] **batch-1-6** — view/applications/ +- [completed] **batch-1-7** — view/auth/ +- [completed] **batch-1-7** — view/brand/ +- [completed] **batch-1-8** — view/content/ +- [completed] **batch-1-9** — view/core/ +- [completed] **batch-1-10** — view/crossborder/ +- [completed] **batch-1-11** — view/dealer/ +- [completed] **batch-1-12** — view/financial/ +- [completed] **batch-1-13** — view/goods/ +- [completed] **batch-1-14** — view/guide/ +- [completed] **batch-1-15** — view/marketing/ +- [completed] **batch-1-16** — view/member/ +- [completed] **batch-1-17** — view/menus/ +- [completed] **batch-1-18** — view/merchant/ +- [completed] **batch-1-19** — view/order/ +- [completed] **batch-1-20** — view/popularize/ +- [completed] **batch-1-21** — view/regionauth/ +- [completed] **batch-1-22** — view/shopscreen/ +- [completed] **batch-1-23** — view/ + +## 第二优先级: components/ 目录 (214 文件) + +- [completed] **batch-2** — components/ 目录 + +## 第三优先级: views/ 目录 (94 文件) + +- [completed] **batch-3** — views/ 目录 + +## 第四优先级: router/ 目录 (89 文件) + +- [completed] **batch-4** — router/ 目录 + +## 第五优先级: api/ 目录 (93 文件) + +- [completed] **batch-5** — api/ 目录 + +## 第六优先级: 基础设施 (66 文件) + +- [completed] **batch-6** — 基础设施目录(layout、mixins、utils 部分) + +## 收尾 + +- [completed] **final-verify** — 最终验证: 确保所有 key 一致性(已修复 locale JSON 语法并补全 en/ar 缺失 key) + +--- + +## 状态说明 + +- `[in_progress]` — 进行中 +- `[pending]` — 未开始 +- `[completed]` — 已完成 + diff --git a/.gitignore b/.gitignore index 48787de..1ab903f 100755 --- a/.gitignore +++ b/.gitignore @@ -20,8 +20,5 @@ release.* .npm-cache/_update-notifier-last-checked AGENTS.md openspec/ -.claude/ dist/ -.cursor/ -.agent/ -.codex/ + diff --git a/package-lock.json b/package-lock.json index 38904d0..35561a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49267,4 +49267,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 5eecb3b..ef6dfa2 100755 --- a/package.json +++ b/package.json @@ -139,4 +139,4 @@ "jugglingdb-nano": "0.0.1", "global": "2.0.1" } -} +} \ No newline at end of file diff --git a/src/components/function/mallList.vue b/src/components/function/mallList.vue index 08abcce..8f08e37 100755 --- a/src/components/function/mallList.vue +++ b/src/components/function/mallList.vue @@ -440,28 +440,28 @@ export default { tabList: [ { pagePath: '/pages/index', - text: '83ced53b.db1c89', + text: this.$t('83ced53b.db1c89'), name: 'home', iconPath: '', selectedIconPath: '' }, { pagePath: '/pages/category/index', - text: '83ced53b.d0771a', + text: this.$t('83ced53b.d0771a'), name: 'category', iconPath: '', selectedIconPath: '' }, { pagePath: '/pages/cart/espier-index', - text: '83ced53b.c017be', + text: this.$t('83ced53b.c017be'), name: 'cart', iconPath: '', selectedIconPath: '' }, { pagePath: '/pages/member/index', - text: '83ced53b.07b181', + text: this.$t('83ced53b.07b181'), name: 'member', iconPath: '', selectedIconPath: '' @@ -613,28 +613,28 @@ export default { data: [ { pagePath: '/pages/index', - text: '83ced53b.db1c89', + text: this.$t('83ced53b.db1c89'), name: 'home', iconPath: '', selectedIconPath: '' }, { pagePath: '/pages/category/index', - text: '83ced53b.d0771a', + text: this.$t('83ced53b.d0771a'), name: 'category', iconPath: '', selectedIconPath: '' }, { pagePath: '/pages/cart/espier-index', - text: '83ced53b.c017be', + text: this.$t('83ced53b.c017be'), name: 'cart', iconPath: '', selectedIconPath: '' }, { pagePath: '/pages/member/index', - text: '83ced53b.07b181', + text: this.$t('83ced53b.07b181'), name: 'member', iconPath: '', selectedIconPath: '' @@ -1036,7 +1036,8 @@ export default { const { tab_bar } = await this.$api.template.getPagesTemplateSetInfo({ pages_template_id: templateId }) - this.navForm = this.$options.data().navForm + // 必须 call(this),否则 data() 内 this.$t 等实例方法不可用 + this.navForm = this.$options.data.call(this).navForm this.navForm.pages_template_id = templateId if (tab_bar) { const { config, data } = JSON.parse(tab_bar) @@ -1076,7 +1077,7 @@ export default { }, onChangePagePath(index, value) { const { label, name } = NAVS.find((item) => item.value == value) - this.navForm.tabList[index].text = label + this.navForm.tabList[index].text = this.$t(label) this.navForm.tabList[index].name = name if (value != 'customPage' && this.navForm.tabList[index]?.customPage) { this.$delete(this.navForm.tabList[index], 'customPage') diff --git a/src/components/sp-picker/main.vue b/src/components/sp-picker/main.vue index a5f9577..d1a9aa7 100755 --- a/src/components/sp-picker/main.vue +++ b/src/components/sp-picker/main.vue @@ -50,10 +50,14 @@ export default { }, data() { - const { title } = PickerType.resolvePickerConfig(this.type) - const { dialogTitle } = this.value + const { title: configTitle } = PickerType.resolvePickerConfig(this.type) + const { dialogTitle } = this.value || {} + // resolvePickerConfig 读到的是各 picker 静态 config.title(i18n key),此处必须翻译,否则弹窗显示 d81d8932.xxx + const resolved = + dialogTitle || + (configTitle != null && configTitle !== '' ? i18n.t(String(configTitle)) : configTitle) return { - title: dialogTitle || title, + title: resolved, isLocalShow: false } }, diff --git a/src/i18n/lang/index.json b/src/i18n/lang/index.json index ec9603c..55d01c4 100644 --- a/src/i18n/lang/index.json +++ b/src/i18n/lang/index.json @@ -47144,7 +47144,6 @@ "bojjht5": { "zh-cn": "1分账提现", "en": "", - "zh-tw": "", "ar": "سحب توزيع 1" }, "4l0o5q9": { @@ -50294,49 +50293,41 @@ "i5bxls4": { "zh-cn": "请登录1", "en": "Please log in", - "zh-tw": "", "ar": "يرجى تسجيل الدخول" }, "1ubti7": { "zh-cn": " 选择商品", "en": "Select product", - "zh-tw": "", "ar": "اختيار المنتج" }, "adabc28": { "zh-cn": "商品产地", "en": "Origin", - "zh-tw": "", "ar": "بلد المنشأ" }, "c4d8787": { "zh-cn": "上传文件如果有处理失败的行数后将会生成错误文件,请及时查看错误信息修改后重新下载,错误描述文件只保留15天。\n超过15天的错误描述文件将会删除,不再提供下载查看", "en": "If any rows fail during file processing, an error file will be generated. Please check the error details, make corrections, and re-upload the file. Note that error files are only retained for 15 days. Error files older than 15 days will be automatically deleted and cannot be downloaded.", - "zh-tw": "", "ar": "إذا فشل معالجة أي صفوف في الملف، سيتم إنشاء ملف خطأ. يرجى التحقق من تفاصيل الخطأ وتصحيحها ثم إعادة رفع الملف. تُحتفظ بملفات الأخطاء لمدة 15 يومًا فقط. سيتم حذف ملفات الأخطاء الأقدم من 15 يومًا تلقائيًا ولن تكون قابلة للتنزيل." }, "f299684": { "zh-cn": "单位", "en": "Unit", - "zh-tw": "", "ar": "الوحدة" }, "4hldev6": { "zh-cn": " 商品导出 ", "en": "Export products", - "zh-tw": "", "ar": "تصدير المنتجات" }, "i9x3tc6": { "zh-cn": "积分商品导出", "en": "Export points products", - "zh-tw": "", "ar": "تصدير منتجات النقاط" }, "ffgvi64": { "zh-cn": "直播管理", "en": "Live streaming management", - "zh-tw": "", "ar": "إدارة البث المباشر" }, "11nehc5": { @@ -50678,7 +50669,11 @@ "vb2zz46": { "zh-cn": "- 角色权限", "en": "", - "zh-tw": "", + "ar": "" + }, + "trsuf36": { + "zh-cn": "酷家乐案例库", + "en": "", "ar": "" }, "trsuf36": { @@ -50690,7 +50685,11 @@ "l8tmwvg": { "zh-cn": "请从左侧选择一个角色进行权限配置", "en": "", - "zh-tw": "", + "ar": "" + }, + "cey9325": { + "zh-cn": "酷家乐实例", + "en": "", "ar": "" }, "cey9325": { @@ -50702,7 +50701,11 @@ "jprn7b6": { "zh-cn": "暂无权限数据", "en": "", - "zh-tw": "", + "ar": "" + }, + "tpy2fp6": { + "zh-cn": "酷家乐实例库", + "en": "", "ar": "" }, "tpy2fp6": { @@ -50714,7 +50717,11 @@ "paeh8nu": { "zh-cn": "当前角色的权限有未保存的更改,是否要放弃更改并选择其他角色?", "en": "", - "zh-tw": "", + "ar": "" + }, + "abaiyt5": { + "zh-cn": "注册导购:", + "en": "", "ar": "" }, "abaiyt5": { @@ -50726,7 +50733,11 @@ "d64c964": { "zh-cn": "放弃更改", "en": "", - "zh-tw": "", + "ar": "" + }, + "dwa5vp7": { + "zh-cn": "输入导购手机号", + "en": "", "ar": "" }, "dwa5vp7": { @@ -50738,7 +50749,6 @@ "nb1hl46": { "zh-cn": "权限更新成功", "en": "", - "zh-tw": "", "ar": "" }, "abplbn5": { @@ -52280,7 +52290,6 @@ "c7iry3": { "zh-cn": "修改项", "en": "", - "zh-tw": "", "ar": "" }, "7kly45": { @@ -52940,25 +52949,26 @@ "juxi1n7": { "zh-cn": "请输入榜单名称", "en": "", - "zh-tw": "", "ar": "" }, "dnqluc4": { "zh-cn": "榜单ID", "en": "", - "zh-tw": "", "ar": "" }, "do5it84": { "zh-cn": "榜单名称", "en": "", - "zh-tw": "", "ar": "" }, "doc7l54": { "zh-cn": "榜单类型", "en": "", - "zh-tw": "", + "ar": "" + }, + "cjvgjy4": { + "zh-cn": "店铺状态", + "en": "", "ar": "" }, "uig1vz6": { @@ -52970,49 +52980,41 @@ "il0abd4": { "zh-cn": "选择榜单", "en": "", - "zh-tw": "", "ar": "" }, "b7kvbn4": { "zh-cn": "品类榜单", "en": "", - "zh-tw": "", "ar": "" }, "c9nwly4": { "zh-cn": "平台榜单", "en": "", - "zh-tw": "", "ar": "" }, "z4uame7": { "zh-cn": "当前店铺名称:", "en": "", - "zh-tw": "", "ar": "" }, "rid648l": { "zh-cn": " 温馨提示:您绑定的企业支付宝账号必须开通", "en": "", - "zh-tw": "", "ar": "" }, "j8lmm57": { "zh-cn": "请上传商户证书", "en": "", - "zh-tw": "", "ar": "" }, "kjgvxs9": { "zh-cn": "请上传商户证书秘钥", "en": "", - "zh-tw": "", "ar": "" }, "7f8jfd6": { "zh-cn": "请输入终端号", "en": "", - "zh-tw": "", "ar": "" }, "9voouy8": { diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json index 1545a46..2b34918 100644 --- a/src/i18n/locales/ar.json +++ b/src/i18n/locales/ar.json @@ -21988,6 +21988,8 @@ "fb06c42c.9f1ea3": "التاجر", "fb06c42c.b2662c": "فئة التاجر", "fb06c42c.e86c4b": "وسم المتجر", + "fb06c42c.2419d0": "فئة المتجر", + "fb06c42c.84b1aa": "معلومات المتاجر القريبة", "3282e396.409120": "المركز الشخصي", "3282e396.7fc88a": "تغيير كلمة المرور", "3282e396.44efd1": "تسجيل الخروج", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 50bee53..716eb45 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -21990,6 +21990,8 @@ "fb06c42c.9f1ea3": "Merchant", "fb06c42c.b2662c": "Merchant category", "fb06c42c.e86c4b": "Store tags", + "fb06c42c.2419d0": "Store Category", + "fb06c42c.84b1aa": "Nearby Store Information", "3282e396.409120": "Personal center", "3282e396.7fc88a": "Change password", "3282e396.44efd1": "Log out", diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index ff978eb..f566557 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -22192,6 +22192,8 @@ "fb06c42c.9f1ea3": "商户", "fb06c42c.b2662c": "商户类目", "fb06c42c.e86c4b": "店铺标签", + "fb06c42c.2419d0": "门店分类", + "fb06c42c.84b1aa": "附近门店信息", "3282e396.409120": "个人中心", "3282e396.7fc88a": "修改密码", "3282e396.44efd1": "退出登录", diff --git a/src/layout/basic/layout-sidebar.vue b/src/layout/basic/layout-sidebar.vue index 690ba25..6725b47 100755 --- a/src/layout/basic/layout-sidebar.vue +++ b/src/layout/basic/layout-sidebar.vue @@ -33,7 +33,7 @@ {{ item.name }}{{ menuDisplayName(item) }} @@ -66,7 +66,7 @@ {{ item.name }} + >{{ menuDisplayName(item) }} @@ -90,7 +90,7 @@ :index="item.alias_name" @click="handleSubMenuClick(item)" > - {{ item.name }} + {{ menuDisplayName(item) }} @@ -101,6 +101,7 @@