Windows 批處理腳本雖屬輕量級自動化利器,卻長期缺乏體系化的多語言支援。本文基於面向對象「分離變與不變」原則,設計並實現一套純腳本、零依賴、可復用的批處理國際化框架,涵蓋語言檢測、資源抽象、鍵值存儲、動態加載全鏈路。
+------------------------+
| 程序內核層 | 業務邏輯,零語言硬編碼
| (Batch Core Logic) | 依賴抽象層 API:getMessage(key)
+-----------+------------+
| 依賴倒置
+-----------v------------+
| 多語言抽象層 | 語言解析器、鍵值映射、存儲適配
| (Message Abstraction) | 實現:getMessageFactory.bat
+-----------+------------+
| 動態加載
+-----------v------------+
| 多語言外殼層 | 具體語言文件、Key=Value 存儲
| (Message Resources) | 格式:message_zh-CN.txt, message_en-US.txt
+------------------------+
getLocale.bat@echo off
rem 讀取註冊表用戶語言設置
for /f "skip=4 tokens=3" %%i in ('reg query "HKCU\Control Panel\International" /v "sLanguage"') do (
set reg_localevar=%%i
)
rem 映射為標準語言代碼
call Keys_v2.bat %reg_localevar%, nlvmapping.txt, %~1
nlvmapping.txtDEU=de
ENU=en-US
ESN=es
FRA=fr
ITA=it
JPN=ja
KOR=ko
PTB=pt-BR
CHS=zh-CN
CHT=zh-TW
getMessageFactory.bat@echo off
set varimp=""
call Keys_v2.bat getMessage, sysconfig.txt, varimp
if not "%varimp%"=="" goto executeMessage
rem 兜底:當前目錄尋找第一個 *getMessage.bat
for %%i in (*getMessage.bat) do (
set varimp=%%i
goto executeMessage
)
:executeMessage
call %varimp% %~1 %~2
sysgetMessage.bat@echo off
set key0=%~1
set varlocale=""
call getLocale.bat varlocale
set varimp=""
call Keys_v2.bat getMessageImp, sysconfig.txt, varimp
if not "%varimp%"=="" goto executeMessageImp
for %%i in (*getMessageImp.bat) do (
set varimp=%%i
goto executeMessageImp
)
:executeMessageImp
call %varimp% %key0% %varlocale% %~2
filegetMessageImp.bat@echo off
set key=%~1
set varlocale=%~2
set filename=message_%varlocale%.txt
rem 回退機制:找不到對應語言用英文
if not exist %filename% set filename=message_en-US.txt
call Keys_v2.bat %key%, %filename%, %~3
Keys_v2.bat@echo off
set key=%~1
set file=%~2
for /F "eol=; tokens=1,* delims==" %%i in (%file%) do (
if "%%i"=="%key%" (
set "%~3=%%j"
goto :eof
)
)
message_zh-CN.txtSystem_detect_begin=系統檢測開始
System_detect_GraphUI_normal=系統檢測圖形界面是否正常
System_detect_over=系統檢測完畢
Failed=操作失敗,請聯繫管理員
Success=操作成功
Continue=繼續
Quit=退出
message_en-US.txtSystem_detect_begin=System detection started
System_detect_GraphUI_normal=Checking if graphical UI is normal
System_detect_over=System detection completed
Failed=Operation failed, please contact administrator
Success=Operation successful
Continue=Continue
Quit=Quit
echo "系統檢測開始"
...
echo "系統檢測圖形界面是否正常"
...
echo "系統檢測完畢"
set msg=""
call getMessageFactory.bat "System_detect_begin", msg
echo %msg%
...
set msg=""
call getMessageFactory.bat "System_detect_GraphUI_normal", msg
echo %msg%
...
set msg=""
call getMessageFactory.bat "System_detect_over", msg
echo %msg%
sysconfig.txtgetMessage=sysgetMessage.bat
getMessageImp=filegetMessageImp.bat
message_en-US.txtgetMessageFactory → 寫入基準文件sysconfig.txt 指定實現策略message_zh-CN.txt、message_ja.txt 等varlocale 變量| 維度 | 評價 |
|---|---|
| 零外部依賴 | ✅ 純 Windows 內建命令實現,攜帶即用 |
| 架構分層清晰 | ✅ 內核/抽象/資源三層解耦,符合 SOLID 原則 |
| 存儲可插拔 | ✅ 工廠模式 + 策略模式,易擴展 DB/Registry 存儲 |
| 性能 | ⚠️ 文件讀取 + 循環解析,高頻調用建議緩存至變量 |
| 編碼處理 | ⚠️ 批處理默認 ANSI,中文文件需保存為當前代碼頁或用 chcp 65001 切 UTF-8 |
| 數組/複雜結構 | ❌ 不支援,需自定義分隔符序列化 |
這套方案在不引入 Python/PowerShell/Java 等外部運行時的前提下,為批處理腳本注入了企業級國際化能力。其核心價值在於:用最樸素的批處理語法,實踐了現代軟件工程的分層、抽象、工廠、策略等經典模式。對於維護大量legacy批處理系統、跨國部署自動化腳本的團隊,具有極高的實際落地價值。