如何解决Delphi 2007中TMonthCalendar控件‘Today’文本本地化失效问题?
解决Delphi 2007中TMonthCalendar佛兰芒语本地化问题
TMonthCalendar是封装的Windows原生控件,它的“Today”文本直接读取系统或控件的区域设置,Localizer工具通常无法直接覆盖这类原生控件的内置文本,可尝试以下几种方案:
方案1:通过API强制设置控件区域语言
在窗体初始化阶段,调用Windows API将TMonthCalendar的区域设置为佛兰芒语(比利时):
uses Windows, CommCtrl; procedure TForm1.FormCreate(Sender: TObject); var LCID: LCID; begin // 生成佛兰芒语(比利时)对应的LCID LCID := MAKELCID(MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH_BELGIAN), SORT_DEFAULT); // 发送MCM_SETLOCALE消息切换控件区域 SendMessage(MonthCalendar1.Handle, MCM_SETLOCALE, WPARAM(LCID), 0); // 刷新控件生效 MonthCalendar1.Invalidate; end;
需确保项目引用CommCtrl单元,该方法会让控件使用指定区域的原生文本,替换默认法语内容。
方案2:子类化控件替换文本(API失效时)
若系统未安装nl-BE语言包或API调用无效,可通过子类化控件直接替换目标文本:
type TForm1 = class(TForm) MonthCalendar1: TMonthCalendar; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FOldWndProc: TWndMethod; procedure NewWndProc(var Message: TMessage); end; implementation procedure TForm1.FormCreate(Sender: TObject); begin FOldWndProc := MonthCalendar1.WindowProc; MonthCalendar1.WindowProc := NewWndProc; end; procedure TForm1.FormDestroy(Sender: TObject); begin MonthCalendar1.WindowProc := FOldWndProc; end; procedure TForm1.NewWndProc(var Message: TMessage); const TODAY_TEXT = 'Vandaag'; // 佛兰芒语“Today” begin if Message.Msg = WM_NOTIFY then begin with PNMHDR(Message.LParam)^ do begin // 查找显示法语“aujourd'hui”的静态子控件并替换文本 var hStatic: HWND; hStatic := FindWindowEx(MonthCalendar1.Handle, 0, 'Static', 'aujourd''hui'); if hStatic <> 0 then SetWindowText(hStatic, TODAY_TEXT); end; end; FOldWndProc(Message); end;
该方法直接定位控件内的静态文本元素,替换为佛兰芒语内容。
方案3:检查系统区域设置
确保Windows系统已安装佛兰芒语(比利时)语言包,并调整非Unicode程序语言设置:
- 打开控制面板→区域和语言选项→高级标签,将“非Unicode程序的语言”设置为“荷兰语(比利时)”
- 重启Delphi及应用程序,控件可能自动读取系统区域文本
注:Delphi 2007对非英语区域原生控件支持有限,优先尝试方案1,这是最直接的原生解决方案。
内容的提问来源于stack exchange,提问作者Nomi Fenoglio
相关产品推荐
相关产品推荐

