Files
2026-08-27 14:29:23 +08:00

169 lines
4.8 KiB
JavaScript

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")