// of_translate(menu a_menu,string as_language) return integer
Long i,n
string s
n=UpperBound(a_menu.item)
For i=1 To n
if trim(a_menu.Item[i].text) <> '-' then
if pos(upper(a_menu.Item[i].tag),'ENGLISH')=0 then
a_menu.Item[i].tag += ',ENGLISH='+a_menu.Item[i].text
end if
s = trim(xargs(a_menu.Item[i].tag,as_language))
if len(s)>0 then
a_menu.Item[i].text = s
a_menu.Item[i].ToolbarItemText = s
end if
end if
If UpperBound(a_menu.Item[i].Item)>0 Then
This.of_translate(a_menu.Item[i],as_language) // 递归
End If
Next
Return 0
三、窗体的翻译
窗体对象有一个属性数组control[],定义了窗体上各个对象的Handle。
// 中英文切换: of_translate(a_window,as_language)
Long i,n
string s
window w
DataWindow dw
Tab tb
UserObject uo
StaticText st
CommandButton cb
CheckBox cx
RadioButton rb
PictureButton pb
GroupBox gb
SetPointer(HourGlass!)
a_window.SetRedraw(False)
// 翻译窗体标题
if pos(upper(a_window.tag),'ENGLISH')=0 then
a_window.tag += ',ENGLISH='+a_window.title
end if
s= trim(xargs(a_window.tag,as_language))
if len(s)>0 then a_window.title = s
// 翻译窗体中的文本、按钮等各种对象
n=UpperBound(a_window.control)
For i=1 To n
if not a_window.control[i].visible then continue
Choose Case a_window.control[i].TypeOf()
Case StaticText!
st = a_window.control[i]
if pos(upper(st.tag),'ENGLISH')=0 then
st.tag += ',ENGLISH='+st.text
end if
s = trim(xargs(st.tag,as_language))
if len(s)>0 then
st.text = s
end if
Case CommandButton!
cb = a_window.control[i]
if pos(upper(cb.tag),'ENGLISH')=0 then
cb.tag += ',ENGLISH='+cb.text
end if
s = trim(xargs(cb.tag,as_language))
if len(s)>0 then
cb.text = s
end if
Case CheckBox!
cx = a_window.control[i]
if pos(upper(cx.tag),'ENGLISH')=0 then
cx.tag += ',ENGLISH='+cx.text
end if
s = trim(xargs(cx.tag,as_language))
if len(s)>0 then cx.text = s
Case RadioButton!
rb = a_window.control[i]
if pos(upper(rb.tag),'ENGLISH')=0 then
rb.tag += ',ENGLISH='+rb.text
end if
s = trim(xargs(rb.tag,as_language))
if len(s)>0 then rb.text = s
Case PictureButton!
pb = a_window.control[i]
if pos(upper(pb.tag),'ENGLISH')=0 then
pb.tag += ',ENGLISH='+pb.text
end if
s = trim(xargs(pb.tag,as_language))
if len(s)>0 then pb.text = s
Case GroupBox!
gb = a_window.control[i]
if pos(upper(gb.tag),'ENGLISH')=0 then
gb.tag += ',ENGLISH='+gb.text
end if
s = trim(xargs(gb.tag,as_language))
if len(s)>0 then gb.text = s
Case DataWindow!
dw = a_window.control[i]
if pos(upper(dw.tag),'ENGLISH')=0 then
dw.tag += ',ENGLISH='+dw.title
end if
s = trim(xargs(dw.tag,as_language))
if len(s)>0 then dw.title = s
// this.of_translate(dw,as_language) // 略
Case Tab!
tb = a_window.control[i]
// this.of_translate(tb,as_language) // 类似窗体翻译
Case UserObject!
uo = a_window.control[i]
// this.of_translate(uo,as_language) // 类似窗体翻译
End Choose
Next
a_window.SetRedraw(True)
SetPointer(Arrow!)
Return 0
四、在应用程序中的调用
1.主菜单(Menu)、主窗体(Frame)、子窗体(Sheet)、响应窗体(Response)等对象均要声明一个Instant变量is_language来记录当前语言:
string is_language='ENGLISH'
2.在主窗口(w_mdi_frame)的Activate事件中:
// 翻译主窗口
if this.is_language<>gnvo_translate.is_language then
gnvo_translate.of_translate(this,gnvo_translate.is_language)
this.is_language = gnvo_translate.is_language
end if
// 翻译主菜单
if m_genapp_frame.is_language<>gnvo_translate.is_language then
gnvo_translate.of_translate(m_genapp_frame,gnvo_translate.is_language)
m_genapp_frame.is_language = gnvo_translate.is_language
end if
3.在子窗体的Activate事件或响应窗体的Open事件中:
if this.is_language<>gnvo_translate.is_language then
gnvo_translate.of_translate(this,gnvo_translate.is_language)
this.is_language = gnvo_translate.is_language
end if
用API 函数
function boolean ImmSimulateHotKey (ULong hWnd, ULong dwHotKeyID) library "IMM32.dll"
function ulong GetKeyboardLayout(ulong dwLayout) LIBRARY "user32.dll"
function boolean ImmIsIME(uLong hklKeyboardLayout) library "IMM32.DLL"
代码:
this.selecttext(1,len(this.text))
hklCurrent=GetKeyboardLayout(0)
if not ImmIsIME(hklCurrent) then
hnd=Handle(parent)
ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle)
end if
用API 函数
function boolean ImmSimulateHotKey (ULong hWnd, ULong dwHotKeyID) library "IMM32.dll"
function ulong GetKeyboardLayout(ulong dwLayout) LIBRARY "user32.dll"
function boolean ImmIsIME(uLong hklKeyboardLayout) library "IMM32.DLL"
代码:
this.selecttext(1,len(this.text))
hklCurrent=GetKeyboardLayout(0)
if not ImmIsIME(hklCurrent) then
hnd=Handle(parent)
ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle)
end if