- 将医保模拟接口从通用路由改为具体功能路由 - 新增签到、取消门诊登记、预结算等功能接口 - 统一返回格式为 code/message/result 结构 - 移除旧版医保接口路由兼容处理 - 更新前端国际化配置文件中的医保相关词条 - 删除重复的无数据提示词条并补充新的字段翻译 - 移除药房模块独立词条合并至通用配置中 - 新增住院管理模块的完整国际化词条配置
117 lines
7.5 KiB
JavaScript
117 lines
7.5 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const viVN = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'viVN.json'), 'utf8'));
|
|
|
|
const direct = {
|
|
'划价收费1相关配置': 'Cấu hình Định giá & Thu phí 1',
|
|
'划价收费2相关配置': 'Cấu hình Định giá & Thu phí 2',
|
|
'使用发票': 'Sử dụng hóa đơn', '普通单据': 'Chứng từ thường',
|
|
'挂号预约相关配置': 'Cấu hình Đăng ký khám', '其他选项相关配置': 'Cấu hình Tùy chọn khác',
|
|
'病人账户相关配置': 'Cấu hình Tài khoản BN', '配置数据加载成功': 'Tải cấu hình thành công',
|
|
'无法加载配置数据': 'Không thể tải dữ liệu cấu hình', '使用默认值': 'Sử dụng mặc định',
|
|
'已恢复默认值': 'Đã khôi phục mặc định', '获取配置列表失败': 'Lấy danh sách cấu hình thất bại',
|
|
'无法保存参数': 'Không thể lưu tham số', '保存成功': 'Lưu thành công',
|
|
'个参数保存成功': 'tham số đã lưu, nhưng', '但以下': 'nhưng các mục sau',
|
|
'个参数保存失败': 'tham số lưu thất bại', '所有参数保存失败': 'Tất cả tham số lưu thất bại',
|
|
'请检查系统配置': 'Vui lòng kiểm tra cấu hình hệ thống',
|
|
'保存操作异常': 'Lỗi thao tác lưu', '请重试': 'Vui lòng thử lại',
|
|
'请输入曝光次数': 'Nhập số lần phơi sáng', '选择服务范围': 'Chọn phạm vi dịch vụ',
|
|
'选择下级医技类型': 'Chọn loại kỹ thuật y tế cấp dưới',
|
|
'无': 'Không', '未知错误': 'Lỗi không xác định',
|
|
'未获取到检查方法数据': 'Không có dữ liệu phương pháp kiểm tra',
|
|
'未获取到检查部位数据': 'Không có dữ liệu vị trí kiểm tra',
|
|
'获取检查类型列表失败': 'Lấy danh sách loại kiểm tra thất bại',
|
|
'无法获取保存ID': 'Không thể lấy ID lưu', '无效的删除ID': 'ID xóa không hợp lệ',
|
|
'请先保存父项': 'Vui lòng lưu mục cha trước',
|
|
'未找到检查方法数据': 'Không tìm thấy dữ liệu phương pháp kiểm tra',
|
|
'未找到检查部位数据': 'Không tìm thấy dữ liệu vị trí kiểm tra',
|
|
'功能开发中': 'Tính năng đang phát triển',
|
|
'确定要删除这一行吗?': 'Xóa dòng này?',
|
|
'系统提示': 'Thông báo hệ thống',
|
|
'第 {page} 页': 'Trang {page}',
|
|
'卫生机构': 'Cơ sở y tế', '请选择机构': 'Chọn cơ sở',
|
|
'套餐级别': 'Cấp gói', '请选择套餐级别': 'Chọn cấp gói',
|
|
'套餐类别': 'Loại gói', '请选择套餐类别': 'Chọn loại gói',
|
|
'用户': 'Người dùng', '请输入用户名称': 'Nhập tên người dùng',
|
|
'服务费': 'Phí dịch vụ', '总金额': 'Tổng số tiền',
|
|
'组合套餐': 'Gói kết hợp', '显示套餐名': 'Hiện tên gói',
|
|
'启用标志': 'Cờ kích hoạt', '操作人': 'Người thao tác',
|
|
'用户选择': 'Chọn người dùng', '折扣': 'Giảm giá', '制单人': 'Người lập phiếu',
|
|
'生成服务费': 'Tạo phí dịch vụ', '请选择用户': 'Chọn người dùng',
|
|
'请选择卫生机构': 'Chọn cơ sở y tế', '自动计算': 'Tự động tính',
|
|
'请输入折扣': 'Nhập giảm giá', '自动合计': 'Tự động tổng hợp',
|
|
'请输入编号': 'Nhập số', '自动获取': 'Tự động lấy', '不启用': 'Không kích hoạt',
|
|
'编号': 'Số', '途径': 'Đường dùng', '频次': 'Tần suất', '天数': 'Số ngày', '产地': 'Nơi sản xuất',
|
|
'添加': 'Thêm', '无匹配项目': 'Không có mục phù hợp',
|
|
'请尝试其他关键词': 'Thử từ khóa khác', '暂无项目数据': 'Không có dữ liệu mục',
|
|
'未命名': 'Chưa đặt tên',
|
|
'请输入有效数量': 'Nhập số lượng hợp lệ', '未找到该项目信息': 'Không tìm thấy thông tin mục',
|
|
'折扣必须在0-100之间': 'Giảm giá phải từ 0-100',
|
|
'请完善必填项:': 'Vui lòng hoàn thành mục bắt buộc:',
|
|
'请至少添加一条套餐明细': 'Thêm ít nhất 1 chi tiết gói',
|
|
'请先确认所有正在编辑的行': 'Xác nhận tất cả dòng đang chỉnh sửa trước',
|
|
'保存失败,请检查表单数据': 'Lưu thất bại, kiểm tra dữ liệu biểu mẫu',
|
|
'至': 'đến', '卫生机构:': 'Cơ sở y tế:', '套餐级别:': 'Cấp gói:',
|
|
'套餐类别:': 'Loại gói:', '用户:': 'Người dùng:',
|
|
'全院套餐': 'Gói toàn viện', '个人套餐': 'Gói cá nhân',
|
|
'总数:': 'Tổng:', '加载用户列表失败': 'Tải danh sách người dùng thất bại',
|
|
'获取机构列表失败': 'Lấy danh sách cơ sở thất bại',
|
|
'编码': 'Mã', '名称': 'Tên', '类型': 'Loại', '状态': 'Trạng thái',
|
|
'操作': 'Thao tác', '备注': 'Ghi chú', '排序': 'Sắp xếp', '描述': 'Mô tả',
|
|
'科室': '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',
|
|
'费用': 'Viện phí', '金额': 'Số tiền', '数量': 'SL', '单价': 'Đơn giá',
|
|
'合计': 'Tổng cộng', '门诊': 'Ngoại trú', '住院': 'Nội trú', '急诊': 'Cấp cứu',
|
|
'手术': 'Phẫu thuật', '护理': 'Điều dưỡng', '检验': 'XN', '检查': 'CLS',
|
|
'病历': 'Bệnh án', '病案': 'Hồ sơ BA', '药品': 'Thuốc', '耗材': 'Vật tư',
|
|
'管理': 'Quản lý', '设置': 'Cài đặt', '配置': 'Cấu hình', '参数': 'Tham số',
|
|
'维护': 'Bảo trì', '目录': 'Danh mục', '对照': 'Đối chiếu',
|
|
'报告': 'Báo cáo', '统计': 'Thống kê', '报表': 'Báo cáo',
|
|
'追溯': 'Truy xuất', '预警': 'Cảnh báo', '监测': 'Giám sát',
|
|
'执行': 'Thực hiện', '追踪': 'Theo dõi', '评估': 'Đánh giá',
|
|
'审批': 'Phê duyệt', '审核': 'Duyệt',
|
|
'收费': 'Thu phí', '退费': 'Hoàn phí', '结算': 'Thanh toán',
|
|
'挂号': 'Đăng ký khám', '预约': 'Hẹn khám',
|
|
'发药': 'Phát thuốc', '退药': 'Trả thuốc',
|
|
'入库': 'Nhập kho', '出库': 'Xuất kho', '盘点': 'Kiểm kê', '调拨': 'Điều chuyển',
|
|
'DRG': 'DRG', 'EMPI': 'EMPI', 'ESB': 'ESB', 'FHIR': 'FHIR', 'LIS': 'LIS', 'PACS': 'PACS',
|
|
};
|
|
|
|
function translateDeep(obj) {
|
|
let count = 0;
|
|
for (const k in obj) {
|
|
if (typeof obj[k] === 'object' && obj[k] !== null) {
|
|
count += translateDeep(obj[k]);
|
|
} else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) {
|
|
if (direct[obj[k]]) { obj[k] = direct[obj[k]]; count++; }
|
|
else {
|
|
let result = obj[k];
|
|
const sorted = Object.entries(direct).sort((a, b) => b[0].length - a[0].length);
|
|
for (const [zh, en] of sorted) {
|
|
const escaped = zh.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
result = result.replace(new RegExp(escaped, 'g'), en);
|
|
}
|
|
result = result.replace(/\s+/g, ' ').trim();
|
|
if (result !== obj[k] && !/[\u4e00-\u9fff]/.test(result)) {
|
|
obj[k] = result; count++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
const c = translateDeep(viVN);
|
|
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'viVN.json'), JSON.stringify(viVN, null, 2), 'utf8');
|
|
console.log('Translated:', c);
|
|
|
|
function countChinese(obj) {
|
|
let c = 0;
|
|
for (const k in obj) {
|
|
if (typeof obj[k] === 'object' && obj[k] !== null) c += countChinese(obj[k]);
|
|
else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) c++;
|
|
}
|
|
return c;
|
|
}
|
|
console.log('Remaining Chinese in viVN:', countChinese(viVN));
|