import fs from "fs" import path from "path" import { fileURLToPath } from "url" const __dirname = path.dirname(fileURLToPath(import.meta.url)) const root = path.resolve(__dirname, "..") // 从 service-enum.ts 解析枚举(简单正则) const enumSrc = fs.readFileSync(path.join(root, "src/sheep/constant/service-enum.ts"), "utf8") const enumBlocks = {} const blockRe = /const (\w+) = \{([^}]+)\}/gs let m while ((m = blockRe.exec(enumSrc))) { const name = m[1] const body = m[2] const values = {} for (const line of body.split("\n")) { const kv = line.match(/["']?(\w+)["']?\s*:\s*"([^"]+)"/) if (kv) values[kv[1]] = kv[2] } enumBlocks[name] = values } /** 英文翻译表:整句优先,否则逐字替换 */ const EN_MAP = { 创建订单: "Order created", 未支付: "Unpaid", 已经支付: "Paid", 退款: "Refund", 已核销: "Verified", 线下购买: "In-store", 线上订餐: "Online order", 外来人员: "Visitor", 跨单位: "Cross-unit", 正元公务餐: "Official meal", "宁波银行(美好生活)": "Ningbo Bank", "共富商城(助农)": "Prosperity shop", "toc访客购买(不记名用户)": "Guest purchase", 消费机支付: "POS payment", 外卖: "Takeaway", 钱包支付: "Wallet", 钱包二维码支付: "Wallet QR", 钱包扫一扫支付: "Wallet scan", 钱包饭卡支付: "Meal card", 人脸识别支付: "Face pay", 跨单位二维码支付: "Cross-unit QR", 外来人员二维码支付: "Visitor QR", 线上二维码支付: "Online QR", 现金支付: "Cash", 智能柜免密支付: "Locker auto-pay", 微信付款码支付: "WeChat code", 微信App支付: "WeChat App", 支付宝付款码支付: "Alipay code", 支付宝App支付: "Alipay App", 中医院: "TCM hospital", 人民医院: "People's hospital", 超市消费卡: "Supermarket card", 活动核销: "Event redemption", 会员申请退款: "Member refund request", 商家确认退款: "Merchant approved", 会员取消退款: "Member cancelled", 商家拒绝退款: "Merchant rejected", 未售后: "No after-sales", 售后中: "In progress", 售后成功: "Refunded", 售后失败: "Failed", 售后完成: "Completed", 买家取消: "Buyer cancelled", 卖家拒绝: "Seller rejected", 昨天: "Yesterday", 今天: "Today", 明天: "Tomorrow", 后天: "Day after tomorrow", 私家车: "Private car", 公车: "Official car", 军车: "Military car", 警车: "Police car", 今日空闲: "Available today", 今日部分空闲: "Partially available", 今日已满: "Full today", 未核销: "Not verified", 已过期: "Expired", 满减券: "Amount-off coupon", 折扣券: "Discount coupon", 立减券: "Instant discount", 兑换券: "Redemption coupon", 支付成功: "Payment success", 支付失败: "Payment failed", 退款中: "Refunding", 退款成功: "Refund success", 退款失败: "Refund failed", 小程序用户钱包充值: "Mini-program wallet top-up", 微信: "WeChat", 支付宝: "Alipay", 家: "Home", 公司: "Company", 学校: "School", 父母家: "Parents' home", } const HK_MAP = { ...EN_MAP, 创建订单: "創建訂單", 未支付: "未支付", 已经支付: "已經支付", 退款: "退款", 已核销: "已核銷", 线下购买: "線下購買", 线上订餐: "線上訂餐", 外卖: "外賣", 钱包支付: "錢包支付", 售后中: "售後中", 售后成功: "售後成功", 售后失败: "售後失敗", 售后完成: "售後完成", 未售后: "未售後", 昨天: "昨天", 今天: "今天", 明天: "明天", 后天: "後天", 未核销: "未核銷", 已过期: "已過期", 支付成功: "支付成功", 支付失败: "支付失敗", 退款中: "退款中", 退款成功: "退款成功", 退款失败: "退款失敗", 微信: "微信", 支付宝: "支付寶", 家: "家", 公司: "公司", 学校: "學校", 父母家: "父母家", } function toEn(zh) { if (EN_MAP[zh]) return EN_MAP[zh] return zh } function toHk(zh) { if (HK_MAP[zh]) return HK_MAP[zh] return zh .replace(/订单/g, "訂單") .replace(/售后/g, "售後") .replace(/核销/g, "核銷") .replace(/支付/g, "支付") .replace(/钱包/g, "錢包") .replace(/单位/g, "單位") } function emitLocale(locale, mapper) { const enumObj = {} for (const [name, values] of Object.entries(enumBlocks)) { enumObj[name] = {} for (const [k, v] of Object.entries(values)) { enumObj[name][k] = locale === "zh-cn" ? v : mapper(v) } } return `export default {\n\tenum: ${JSON.stringify(enumObj, null, "\t").replace(/"(\d+)":/g, "$1:")},\n}\n` } const outDir = path.join(root, "src/i18n/enum") fs.mkdirSync(outDir, { recursive: true }) fs.writeFileSync(path.join(outDir, "zh-cn.ts"), emitLocale("zh-cn", (v) => v)) fs.writeFileSync(path.join(outDir, "en.ts"), emitLocale("en", toEn)) fs.writeFileSync(path.join(outDir, "zh-hk.ts"), emitLocale("zh-hk", toHk)) console.log("generated enum i18n:", Object.keys(enumBlocks).length, "enums")