Hi,大家好!
在我服务过众多的甲方爸爸中,有不少是外企或者是合资企业,他们大多有一个共同的语言语言要求,就是英文!当然,像我这样的开发老炮,英语水平也只是勉强够用。所以,今天就和大家聊聊如何实现Access系统的中文与英文切换功能。
很多朋友遇到多语言需求,第一反应是:
方法1:做两套系统
❌ 维护成本翻倍
❌ 功能更新要改两次
❌ 容易出现版本不一致
If language = "EN"ThenMe.Label1.Caption = "Customer Name"ElseMe.Label1.Caption = "客户名称"EndIf
❌ 代码臃肿难维护
❌ 新增语言要改所有代码
❌ 翻译散落各处,管理混乱
方法3:每个控件做两个
❌ 界面设计复杂
❌ 控件太多影响性能
❌ 调整布局要改两遍
建表 tblLanguage:
| 字段名 | 类型 | 说明 |
| TextKey | 文本(主键) | 翻译键,如 "BTN_SAVE" |
| CN | 文本 |
|
| EN | 文本 |
|
可以填写一些数据:
| FORM_TITLE_MAIN | 客户管理系统 | Customer Management System |
| BTN_SAVE | 保存 | Save |
| BTN_DELETE | 删除 |
|
| BTN_CLOSE |
|
|
| LBL_CUSTOMER_NAME | 客户名称 |
|
接着创建一个窗体,如图:
在窗体设计视图中,给需要翻译的控件设置Tag属性,比如标签控件的tag输入:LANG=FORM_TITLE_MAIN

先添加一个通用模块:
OptionCompare DatabaseOptionExplicit'=============================================' 模块:modLanguage' 功能:多语言支持模块' 作者:Access开发'=============================================Public sLan AsString'获取翻译文本PublicFunction T(strKey AsString) AsStringDim rs As DAO.RecordsetDim strSQL AsStringDim strLang AsStringOnErrorGoTo Err_HandlerstrLang = sLanstrSQL = "SELECT " & strLang & " FROM tblLanguage WHERE TextKey='" & strKey & "'"Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)IfNot rs.EOF ThenT = Nz(rs.fields(0).value, strKey)ElseT = strKey '找不到翻译就返回键名EndIfrs.CloseSet rs = NothingExitFunctionErr_Handler:T = strKeyEndFunction'应用语言到窗体PublicSub ApplyLanguageToForm(frm As Form)Dim ctl As ControlDim strKey AsStringOnErrorResumeNext'处理窗体标题(Tag格式:LANG=键名)If InStr(frm.Tag, "LANG=") > 0ThenstrKey = Mid(frm.Tag, InStr(frm.Tag, "LANG=") + 5)strKey = Split(strKey, ";")(0) '支持多个标记用分号分隔frm.Caption = T(strKey)EndIf'处理所有控件ForEach ctl In frm.ControlsIf InStr(ctl.Tag, "LANG=") > 0ThenstrKey = Mid(ctl.Tag, InStr(ctl.Tag, "LANG=") + 5)strKey = Split(strKey, ";")(0)'根据控件类型设置不同属性SelectCase ctl.ControlTypeCase acLabel, acCommandButton, acToggleButtonctl.Caption = T(strKey)Case acTextBox, acComboBox, acListBox'文本框可能需要设置占位符If InStr(ctl.Tag, "PLACEHOLDER") > 0Thenctl.PlaceholderText = T(strKey)EndIfCase acPage '选项卡页ctl.Caption = T(strKey)EndSelectEndIfNext ctlEndSub'刷新所有打开的窗体PublicSub RefreshAllForms()Dim i AsIntegerFor i = 0To Forms.Count - 1ApplyLanguageToForm Forms(i)Next i'刷新界面DoEventsEndSub
在窗体上输入代码:
PrivateSub btnLanguage_Click()'可以加个提示IfMe.cmb_Lan = "EN"ThenMsgBox "Language switched to English", vbInformationElseMsgBox "语言已切换为中文", vbInformationEndIfsLan = Me.cmb_LanApplyLanguageToForm MeEndSubPrivateSub Form_Load()ApplyLanguageToForm MeEndSub
最后就是运行测试一下了。
通过"资源表+Tag标记+VBA模块"的方式,我们可以:
✅ 轻松实现多语言切换
✅ 统一管理所有翻译
✅ 支持动态添加语言
✅ 不改变原有程序结构
✅ 维护方便,扩展简单
这个是一个基础的中英文的切换,下次我们来讲讲不基础的方式,通过API调用的。

