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

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