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

118 lines
6.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
const path = require('path');
const enUS = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'enUS.json'), 'utf8'));
const direct = {
'第 {row} 行数据已保存': 'Row {row} data saved',
'删除成功!已删除 1 个父行和 {count} 个子行': 'Deleted! Removed 1 parent row and {count} child rows',
'加载{menu}数据失败,请检查网络或服务状态': 'Failed to load {menu} data, check network or service',
'搜索到{count}条检查方法数据': 'Found {count} inspection method records',
'搜索到{count}条检查部位数据': 'Found {count} inspection part records',
'确定要删除这一行吗?': 'Delete this row?',
'该操作将同时删除 {count} 个子行数据。': 'This will also delete {count} child rows.',
'第 {page} 页': 'Page {page}',
'卫生机构': 'Healthcare Org', '请选择机构': 'Select organization',
'套餐级别': 'Package Level', '请选择套餐级别': 'Select package level',
'套餐类别': 'Package Category', '请选择套餐类别': 'Select package category',
'用户': 'User', '请输入用户名称': 'Enter user name',
'服务费': 'Service Fee', '总金额': 'Total Amount',
'组合套餐': 'Combo Package', '显示套餐名': 'Show package name',
'启用标志': 'Enable Flag', '操作人': 'Operator',
'旧编码格式,建议编辑套餐重新选择科室': 'Old code format, edit package to reselect dept',
' (旧格式)': ' (Old format)',
'该套餐创建者未知,无法删除': 'Package creator unknown, cannot delete',
'确认删除套餐ID:{id} - {name} 吗?删除后将无法恢复': 'Delete package ID:{id} - {name}? Cannot be undone.',
'该套餐已被使用,无法删除': 'Package in use, cannot delete',
'查看套餐': 'View Package', '用户选择': 'User Selection',
'折扣': 'Discount', '制单人': 'Creator', '生成服务费': 'Generate Service Fee',
'请选择用户': 'Select user', '请选择卫生机构': 'Select healthcare org',
'自动计算': 'Auto Calculate', '请输入折扣': 'Enter discount',
'自动合计': 'Auto Total', '请输入编号': 'Enter number',
'输入名称/首字母/编号搜索': 'Search by name/initial/number',
'自动获取': 'Auto Fetch', '不启用': 'Disabled',
'编号': 'No.', '途径': 'Route', '频次': 'Frequency', '天数': 'Days', '产地': 'Origin',
'添加': 'Add', '无匹配项目': 'No matching items',
'请尝试其他关键词': 'Try other keywords', '暂无项目数据': 'No item data',
'未命名': 'Unnamed',
'成功加载{count}个诊疗项目': 'Loaded {count} treatment items',
'未获取到诊疗项目数据': 'No treatment item data',
'获取诊疗项目列表失败': 'Failed to get treatment item list',
'请输入有效数量': 'Enter valid quantity', '未找到该项目信息': 'Item info not found',
'折扣必须在0-100之间': 'Discount must be 0-100',
'请完善必填项:': 'Please complete required fields:',
'请至少添加一条套餐明细': 'Add at least one package detail',
'请先确认所有正在编辑的行': 'Confirm all editing rows first',
'请完善所有明细项目信息(项目名称和数量为必填项)': 'Complete all detail items (name and quantity required)',
'保存失败,请检查表单数据': 'Save failed, check form data',
'至': 'to', '卫生机构:': 'Healthcare Org:', '套餐级别:': 'Package Level:',
'套餐类别:': 'Package Category:', '用户:': 'User:',
'全院套餐': 'Hospital Package', '个人套餐': 'Personal Package',
'总数:': 'Total:', '加载用户列表失败': 'Failed to load user list',
'获取机构列表失败': 'Failed to get org list',
'无法获取套餐ID请刷新页面后重试': 'Cannot get package ID, refresh and retry',
'无法获取套餐ID删除失败': 'Cannot get package ID, delete failed',
'编码': 'Code', '名称': 'Name', '类型': 'Type', '状态': 'Status',
'操作': 'Action', '备注': 'Remark', '排序': 'Sort', '描述': 'Description',
'科室': 'Dept', '部门': 'Department', '医生': 'Doctor', '护士': 'Nurse',
'患者': 'Patient', '诊断': 'Diagnosis', '处方': 'Rx', '医嘱': 'Order',
'费用': 'Fee', '金额': 'Amount', '数量': 'Qty', '单价': 'Price',
'合计': 'Total', '开始时间': 'Start Time', '结束时间': 'End Time',
'门诊': 'OPD', '住院': 'IPD', '急诊': 'Emergency',
'手术': 'Surgery', '护理': 'Nursing', '检验': 'Lab', '检查': 'Inspection',
'病历': 'EMR', '病案': 'Case', '药品': 'Drug', '耗材': 'Consumable',
'报告': 'Report', '统计': 'Statistics', '报表': 'Report',
'质量': 'Quality', '指标': 'Indicator', '管理': 'Management',
'设置': 'Settings', '配置': 'Config', '参数': 'Parameter',
'维护': 'Maintenance', '目录': 'Catalog', '对照': 'Mapping',
'追溯': 'Traceability', '预警': 'Alert', '监测': 'Monitoring',
'执行': 'Execution', '追踪': 'Tracking',
'评估': 'Assessment', '筛查': 'Screening',
'审批': 'Approval', '审核': 'Review',
'闭环': 'Closed Loop', '组套': 'Template', '增强': 'Enhanced',
'收费': 'Charge', '退费': 'Refund', '结算': 'Settlement',
'挂号': 'Registration', '预约': 'Appointment',
'发药': 'Dispensing', '退药': 'Drug Return',
'入库': 'Inbound', '出库': 'Outbound', '盘点': 'Stocktaking', '调拨': 'Transfer',
};
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(enUS);
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'enUS.json'), JSON.stringify(enUS, 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 enUS:', countChinese(enUS));