Files
his/healthlink-his-ui/scripts/rebuild_autotranslate.cjs
chenqi 24dc16b8d1 refactor(ybmock): 重构医保模拟接口并更新国际化配置
- 将医保模拟接口从通用路由改为具体功能路由
- 新增签到、取消门诊登记、预结算等功能接口
- 统一返回格式为 code/message/result 结构
- 移除旧版医保接口路由兼容处理
- 更新前端国际化配置文件中的医保相关词条
- 删除重复的无数据提示词条并补充新的字段翻译
- 移除药房模块独立词条合并至通用配置中
- 新增住院管理模块的完整国际化词条配置
2026-06-26 16:06:15 +08:00

196 lines
11 KiB
JavaScript

const fs = require('fs');
const path = require('path');
// Build clean English dictionary
const en = {
'新增':'Add','编辑':'Edit','删除':'Delete','查询':'Search','重置':'Reset',
'确定':'Confirm','取消':'Cancel','保存':'Save','提交':'Submit','关闭':'Close',
'导出':'Export','导入':'Import','刷新':'Refresh','打印':'Print','复制':'Copy',
'返回':'Back','完成':'Finish','查看':'View','详情':'Detail','明细':'Detail','列表':'List',
'操作':'Action','状态':'Status','排序':'Sort',
'启用':'Enabled','停用':'Disabled','正常':'Normal','异常':'Abnormal',
'是':'Yes','否':'No','有':'Yes','无':'None',
'成功':'Success','失败':'Failed','警告':'Warning','提示':'Tip','错误':'Error',
'加载中':'Loading','暂无数据':'No Data','请选择':'Please select','请输入':'Please enter',
'确认删除':'Confirm Delete','操作成功':'Operation successful','操作失败':'Operation failed',
'保存成功':'Saved','删除成功':'Deleted','新增成功':'Added','修改成功':'Modified',
'序号':'No.','编号':'No.','编码':'Code','名称':'Name','姓名':'Name',
'性别':'Gender','年龄':'Age','类型':'Type','级别':'Level',
'日期':'Date','时间':'Time','创建时间':'Create Time','更新时间':'Update Time',
'备注':'Remark','描述':'Description','创建人':'Creator','更新人':'Updater',
'数量':'Qty','金额':'Amount','单价':'Price','总价':'Total','价格':'Price',
'费用':'Fee','规格':'Spec','单位':'Unit','批号':'Batch No.',
'科室':'Dept','部门':'Department','医生':'Doctor','护士':'Nurse',
'患者':'Patient','患者姓名':'Patient Name','患者ID':'Patient ID',
'病历号':'MRN','住院号':'Admission No.','门诊号':'OPD No.',
'诊断':'Diagnosis','处方':'Rx','医嘱':'Order',
'药品':'Drug','剂量':'Dosage','用法':'Usage','频次':'Frequency',
'开始时间':'Start Time','结束时间':'End Time',
'联系电话':'Phone','手机号':'Phone','地址':'Address',
'身份证号':'ID No.','就诊卡号':'Visit Card','卡号':'Card No.',
'来源':'Source','结果':'Result','参考值':'Ref Value','参考范围':'Ref Range',
'项目':'Item','耗材':'Consumable','库存':'Stock','入库':'Inbound','出库':'Outbound',
'供应商':'Supplier','生产商':'Manufacturer','有效期':'Expiry',
'发票号':'Invoice No.','单据号':'Document No.',
'结算':'Settlement','支付方式':'Payment Method',
'合计':'Total','总计':'Grand Total','小计':'Subtotal',
'应收':'Receivable','实收':'Actual','欠费':'Arrears','找零':'Change',
'退费':'Refund','待处理':'Pending','处理中':'Processing','已完成':'Completed',
'已取消':'Cancelled','已确认':'Confirmed','已审核':'Reviewed',
'已批准':'Approved','已拒绝':'Rejected','待审核':'Pending Review',
'已签到':'Checked In','已就诊':'Consulted','已退号':'Cancelled',
'全部':'All','其他':'Other','男':'Male','女':'Female','未知':'Unknown',
'元':'Yuan','次':'Times','天':'Days','小时':'Hours','分钟':'Minutes',
'系统':'System','设置':'Settings','配置':'Configuration',
'权限':'Permission','角色':'Role','菜单':'Menu','字典':'Dictionary',
'用户':'User','密码':'Password','登录':'Login','退出':'Logout',
'首页':'Home','仪表盘':'Dashboard','个人中心':'Profile',
'医院信息管理系统':'Hospital HIS','经创贺联':'HealthLink',
'门诊':'OPD','住院':'IPD','急诊':'Emergency',
'外科':'Surgery','内科':'Internal Medicine','妇产科':'OB/GYN',
'儿科':'Pediatrics','骨科':'Orthopedics','眼科':'Ophthalmology',
'耳鼻喉':'ENT','口腔':'Dental','皮肤科':'Dermatology',
'中医':'TCM','康复':'Rehabilitation','放射':'Radiology','超声':'Ultrasound',
'病理':'Pathology','输血':'Blood Transfusion','透析':'Dialysis',
'重症':'ICU','新生儿':'Neonatal','产科':'Obstetrics',
'ICU':'ICU','住院部':'Inpatient Dept','儿科门诊':'Pediatric OPD',
'影像科':'Radiology Dept','急诊科':'Emergency Dept',
'手术室':'Operating Room','检验科':'Lab Dept','药房':'Pharmacy',
'门诊内科':'Internal Medicine OPD','门诊外科':'Surgery OPD','门诊部':'OPD Dept',
'康复科':'Rehab Dept','药剂科':'Pharmacy Dept','设备科':'Equipment Dept',
'信息科':'IT Dept','财务科':'Finance Dept','人事科':'HR Dept',
'医务科':'Medical Affairs Dept','护理部':'Nursing Dept',
'质控科':'Quality Control Dept','院感科':'Infection Control Dept',
'病案室':'Medical Record Room','挂号处':'Registration','收费处':'Cashier',
'药库':'Pharmacy Warehouse','中药房':'Chinese Pharmacy','西药房':'Western Pharmacy',
'门诊药房':'OPD Pharmacy','住院药房':'IPD Pharmacy','急诊药房':'Emergency Pharmacy',
'工作站':'Workstation','日结':'Daily Settlement','换卡':'Card Replacement',
'预交金':'Prepayment','收费':'Charge','划价':'Pricing','发药':'Dispensing','退药':'Drug Return',
'闭环':'Closed Loop','组套':'Template','增强':'Enhanced','质量':'Quality',
'维护':'Maintenance','目录':'Catalog','对照':'Mapping',
'追溯':'Traceability','预警':'Alert','监测':'Monitoring',
'床位':'Bed','分诊':'Triage','抢救':'Rescue','绿色通道':'Green Channel',
'知情同意':'Informed Consent','临床路径':'Clinical Pathway',
'随访':'Follow-up','会诊':'Consultation','传染病':'Infectious Disease',
'抗菌':'Antibiotic','手术':'Surgery','护理':'Nursing','检验':'Lab Test','检查':'Examination',
'病历':'Medical Record','病案':'Case Record','报告':'Report',
'DRG':'DRG','EMPI':'EMPI','ESB':'ESB','FHIR':'FHIR','LIS':'LIS','PACS':'PACS',
};
// Build clean Vietnamese dictionary
const vi = {
'新增':'Thêm','编辑':'Sửa','删除':'Xóa','查询':'Tìm kiếm','重置':'Đặt lại',
'确定':'Xác nhận','取消':'Hủy','保存':'Lưu','提交':'Gửi','关闭':'Đóng',
'导出':'Xuất','导入':'Nhập','刷新':'Làm mới','打印':'In','复制':'Sao chép',
'返回':'Quay lại','完成':'Hoàn thành','查看':'Xem','详情':'Chi tiết','列表':'Danh sách',
'操作':'Thao tác','状态':'Trạng thái','排序':'Sắp xếp',
'启用':'Kích hoạt','停用':'Vô hiệu','正常':'Bình thường','异常':'Bất thường',
'是':'Có','否':'Không','有':'Có','无':'Không',
'成功':'Thành công','失败':'Thất bại','警告':'Cảnh báo','提示':'Thông báo','错误':'Lỗi',
'加载中':'Đang tải','暂无数据':'Không có dữ liệu',
'请选择':'Vui lòng chọn','请输入':'Vui lòng nhập',
'男':'Nam','女':'Nữ','未知':'Không xác định',
'序号':'STT','编号':'Số','编码':'Mã','名称':'Tên','姓名':'Họ tên',
'性别':'Giới tính','年龄':'Tuổi','类型':'Loại','级别':'Cấp',
'日期':'Ngày','时间':'Thời gian','创建时间':'TG tạo','更新时间':'TG cập nhật',
'备注':'Ghi chú','描述':'Mô tả',
'数量':'SL','金额':'Số tiền','单价':'Đơn giá','价格':'Giá',
'规格':'Quy cách','单位':'Đơn vị','批号':'Số lô',
'科室':'Khoa','部门':'Phòng ban','医生':'Bác sĩ','护士':'Điều dưỡng',
'患者':'Bệnh nhân','诊断':'Chẩn đoán','处方':'Đơn thuốc','医嘱':'Y lệnh',
'药品':'Thuốc','费用':'Viện phí','合计':'Tổng cộng',
'库存':'Tồn kho','入库':'Nhập kho','出库':'Xuất kho',
'结算':'Thanh toán','支付方式':'PT thanh toán',
'门诊':'Ngoại trú','住院':'Nội trú','急诊':'Cấp cứu',
'外科':'Ngoại khoa','内科':'Nội khoa','妇产科':'Sản phụ khoa',
'儿科':'Nhi khoa','骨科':'Chỉnh hình','眼科':'Mắt',
'耳鼻喉':'TMH','口腔':'RHM','皮肤科':'Da liễu',
'中医':'YHCT','康复':'PHCN','放射':'X quang','超声':'Siêu âm',
'病理':'Bệnh lý','输血':'Truyền máu','透析':'Lọc máu',
'重症':'HSCC','新生儿':'Sơ sinh','产科':'Sản khoa',
'ICU':'ICU','住院部':'Khoa Nội trú','儿科门诊':'PK Nhi',
'影像科':'Khoa CĐHA','急诊科':'Khoa Cấp cứu',
'手术室':'Phòng mổ','检验科':'Khoa Xét nghiệm','药房':'Nhà thuốc',
'门诊内科':'PK Nội','门诊外科':'PK Ngoại','门诊部':'Khoa Khám bệnh',
'全部':'Tất cả','其他':'Khác',
'保存':'Lưu','确定':'OK','新增':'Thêm','编辑':'Sửa','删除':'Xóa',
'查看':'Xem','查询':'Tìm kiếm','重置':'Đặt lại','导出':'Xuất','导入':'Nhập',
'刷新':'Làm mới','提交':'Gửi','审核':'Duyệt',
'系统':'Hệ thống','设置':'Cài đặt','权限':'Phân quyền','角色':'Vai trò',
'用户':'Người dùng','密码':'Mật khẩu','登录':'Đăng nhập','退出':'Đăng xuất',
'首页':'Trang chủ','仪表盘':'Bảng điều khiển',
'元':'đồng','次':'lần','天':'ngày',
'待处理':'Chờ xử lý','处理中':'Đang xử lý','已完成':'Hoàn thành','已取消':'Đã hủy',
'待审核':'Chờ duyệt','已审核':'Đã duyệt','已拒绝':'Đã từ chối',
'手术':'Phẫu thuật','护理':'Điều dưỡng','检验':'Xét nghiệm','检查':'Khám',
'病历':'Bệnh án','病案':'Hồ sơ bệnh án','报告':'Báo cáo',
};
// Build the file
const content = `/**
* Offline auto-translate plugin
* When $t() can't find a translation, auto-lookup from preset dictionary
*/
import Cookies from 'js-cookie'
// Preset translation dictionary - Chinese to each language
const translationDict = {
'en': ${JSON.stringify(en, null, 2)},
'vi': ${JSON.stringify(vi, null, 2)}
}
// Current language
function getCurrentLang() {
return Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
}
// Auto-translate function
export function autoTranslate(chineseText) {
const lang = getCurrentLang()
if (lang === 'zh-CN') return chineseText
const langKey = lang === 'en' ? 'en' : lang === 'vi' ? 'vi' : null
if (!langKey) return chineseText
const dict = translationDict[langKey]
if (!dict) return chineseText
// Exact match
if (dict[chineseText]) return dict[chineseText]
// Try compound translation
let result = chineseText
const sorted = Object.entries(dict).sort((a, b) => b[0].length - a[0].length)
for (const [zh, en] of sorted) {
result = result.replace(new RegExp(zh, 'g'), en)
}
return result
}
// Vue plugin
export const AutoTranslatePlugin = {
install(app) {
if (import.meta.env.DEV) {
const originalT = app.config.globalProperties.$t
if (originalT) {
app.config.globalProperties.$t = function(key, ...args) {
const result = originalT.call(this, key, ...args)
if (result === key && /[\\u4e00-\\u9fff]/.test(key)) {
return autoTranslate(key)
}
return result
}
}
}
}
}
export default { autoTranslate, AutoTranslatePlugin }
`;
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'autoTranslate.js'), content, 'utf8');
console.log('Rebuilt autoTranslate.js');
console.log('en keys:', Object.keys(en).length);
console.log('vi keys:', Object.keys(vi).length);