|
|
# -*- coding: utf-8 -*-import reimport osfrom collections import defaultdict
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
proc_calls = re.compile(r'(?:getProcedureData|execProduceData)\("([^"]+)"')java_throw_rt = re.compile(r'throw new RuntimeException\("([^"]+)"')java_throw_cr = re.compile(r'throw new CustomerRuntimeException\(\d+,\s*"([^"]+)"')java_put_msg = re.compile(r'put\("(?:errorMsg|resultMsg|message|msg)"\s*,\s*"([^"]+)"')
menus = []labels_print = []frontend = defaultdict(set)backend_msgs = defaultdict(set)proc_list = set()proc_handlers = set()
# master.ftlmaster_path = os.path.join(ROOT, 'src/main/resources/templates/master.ftl')with open(master_path, encoding='utf-8') as f: content = f.read() for m in re.finditer(r'<a[^>]*>([^<]+)</a>', content): text = m.group(1).strip() if text: menus.append(text) for m in re.finditer(r'label="([^"]+)"', content): frontend['表单标签'].add(f'master.ftl: {m.group(1)}') for m in re.finditer(r"dialog\('setTitle',\s*'([^']+)'", content): frontend['弹窗标题'].add(m.group(1)) for m in re.finditer(r"layer\.alert\('([^']+)'", content): frontend['layer提示'].add(m.group(1)) for m in re.finditer(r"messager\.alert\('[^']*','([^']+)'", content): frontend['messager提示'].add(m.group(1)) for m in re.finditer(r"messager\.confirm\('[^']*','([^']+)'", content): frontend['确认框'].add(m.group(1))
# Javafor dirpath, _, files in os.walk(os.path.join(ROOT, 'src/main/java')): for fn in files: if not fn.endswith('.java'): continue path = os.path.join(dirpath, fn) rel = os.path.relpath(path, ROOT).replace('\\', '/') with open(path, encoding='utf-8', errors='ignore') as f: text = f.read() for m in proc_calls.finditer(text): proc_list.add(m.group(1)) if 'result_msg' in text or 'result_code' in text: proc_handlers.add(rel) for m in java_throw_rt.finditer(text): backend_msgs[m.group(1)].add(rel) for m in java_throw_cr.finditer(text): backend_msgs[m.group(1)].add(rel) for m in java_put_msg.finditer(text): backend_msgs[m.group(1)].add(rel)
# Templatesfor dirpath, _, files in os.walk(os.path.join(ROOT, 'src/main/resources/templates')): for fn in files: if not fn.endswith('.ftl'): continue path = os.path.join(dirpath, fn) rel = os.path.relpath(path, ROOT).replace('\\', '/') with open(path, encoding='utf-8', errors='ignore') as f: text = f.read()
if '/print/' in rel.replace('\\', '/'): for m in re.finditer(r'ADD_PRINT_TEXT\([^,]+,[^,]+,[^,]+,[^,]+,"([^"]+)"', text): s = m.group(1) if '${' not in s and not s.startswith('+'): labels_print.append((rel, s)) for m in re.finditer(r'"([\u4e00-\u9fff]+)"', text): labels_print.append((rel, m.group(1)))
for m in re.finditer(r'field:[^>]+>([^<]+)</th>', text): col = m.group(1).strip() if col: frontend['表格列名'].add(f'{rel}: {col}') for m in re.finditer(r'label="([^"]*)"', text): if re.search(r'[\u4e00-\u9fff]', m.group(1)): frontend['表单标签'].add(f'{rel}: {m.group(1)}') for m in re.finditer(r"title:\s*'([^']+)'", text): if re.search(r'[\u4e00-\u9fff]', m.group(1)) or m.group(1) in ('提示', 'Error', 'Confirm', 'Info'): frontend['弹窗标题'].add(f'{rel}: {m.group(1)}') for m in re.finditer(r"layer\.(?:alert|msg)\('([^']+)'", text): frontend['layer提示'].add(f'{rel}: {m.group(1)}') for m in re.finditer(r"messager\.(?:alert|confirm)\('[^']*',\s*'([^']+)'", text): frontend['messager提示'].add(f'{rel}: {m.group(1)}') for m in re.finditer(r'<h[1-4][^>]*>([^<]+)</h[1-4]>', text): t = m.group(1).strip() if re.search(r'[\u4e00-\u9fff]', t): frontend['页面标题'].add(f'{rel}: {t}') for m in re.finditer(r'<button[^>]*>([^<]+)</button>', text): t = m.group(1).strip() if re.search(r'[\u4e00-\u9fff]', t): frontend['按钮'].add(f'{rel}: {t}')
# Output summaryout = []out.append(f'Menus: {len(menus)}')out.append(f'Procedures: {len(proc_list)}')out.append(f'Backend messages: {len(backend_msgs)}')out.append(f'Print labels: {len(labels_print)}')for k, v in sorted(frontend.items()): out.append(f'Frontend {k}: {len(v)}')
print('\n'.join(out))print('\n=== PROCEDURES ===')for p in sorted(proc_list): print(p)print('\n=== PROC HANDLERS ===')for p in sorted(proc_handlers): print(p)
# Write JSON for doc generationimport jsondata = { 'menus': menus, 'procedures': sorted(proc_list), 'procedure_handlers': sorted(proc_handlers), 'backend_messages': {k: sorted(v) for k, v in sorted(backend_msgs.items())}, 'frontend': {k: sorted(v) for k, v in sorted(frontend.items())}, 'print_labels': labels_print,}with open(os.path.join(ROOT, 'scripts', 'i18n_extract.json'), 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2)print('\nWrote scripts/i18n_extract.json')
|