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

在窗体设计视图中,给需要翻译的控件设置Tag属性,比如标签控件的tag输入:LANG=FORM_TITLE_MAIN

03
添加代码
先添加一个通用模块:
Option Compare Database
Option Explicit
'=============================================
' 模块:modLanguage
' 功能:多语言支持模块
' 作者:Access开发
'=============================================
Public sLan As String
'获取翻译文本
Public Function T(strKey As String) As String
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strLang As String
On Error GoTo Err_Handler
strLang = sLan
strSQL = "SELECT " & strLang & " FROM tblLanguage WHERE TextKey='" & strKey & "'"
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
If Not rs.EOF Then
T = Nz(rs.fields(0).value, strKey)
Else
T = strKey '找不到翻译就返回键名
End If
rs.Close
Set rs = Nothing
Exit Function
Err_Handler:
T = strKey
End Function
'应用语言到窗体
Public Sub ApplyLanguageToForm(frm As Form)
Dim ctl As Control
Dim strKey As String
On Error Resume Next
'处理窗体标题(Tag格式:LANG=键名)
If InStr(frm.Tag, "LANG=") > 0 Then
strKey = Mid(frm.Tag, InStr(frm.Tag, "LANG=") + 5)
strKey = Split(strKey, ";")(0) '支持多个标记用分号分隔
frm.Caption = T(strKey)
End If
'处理所有控件
For Each ctl In frm.Controls
If InStr(ctl.Tag, "LANG=") > 0 Then
strKey = Mid(ctl.Tag, InStr(ctl.Tag, "LANG=") + 5)
strKey = Split(strKey, ";")(0)
'根据控件类型设置不同属性
Select Case ctl.ControlType
Case acLabel, acCommandButton, acToggleButton
ctl.Caption = T(strKey)
Case acTextBox, acComboBox, acListBox
'文本框可能需要设置占位符
If InStr(ctl.Tag, "PLACEHOLDER") > 0 Then
ctl.PlaceholderText = T(strKey)
End If
Case acPage '选项卡页
ctl.Caption = T(strKey)
End Select
End If
Next ctl
End Sub
'刷新所有打开的窗体
Public Sub RefreshAllForms()
Dim i As Integer
For i = 0 To Forms.Count - 1
ApplyLanguageToForm Forms(i)
Next i
'刷新界面
DoEvents
End Sub
在窗体上输入代码:
Private Sub btnLanguage_Click()
'可以加个提示
If Me.cmb_Lan = "EN" Then
MsgBox "Language switched to English", vbInformation
Else
MsgBox "语言已切换为中文", vbInformation
End If
sLan = Me.cmb_Lan
ApplyLanguageToForm Me
End Sub
Private Sub Form_Load()
ApplyLanguageToForm Me
End Sub
04
运行测试
最后就是运行测试一下了。


通过"资源表+Tag标记+VBA模块"的方式,我们可以:
✅ 轻松实现多语言切换
✅ 统一管理所有翻译
✅ 支持动态添加语言
✅ 不改变原有程序结构
✅ 维护方便,扩展简单
这个是一个基础的中英文的切换,下次我们来讲讲不基础的方式,通过API调用的。

469

被折叠的 条评论
为什么被折叠?



