导航
  • 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

pb 应用的中英文切换如何作?--- 200分

eastyan 2002-06-10 10:16:41

如果应用较大,涉及众多的pb对象:窗口、菜单、数据窗口、用户对象等等。
如何处理?

或者有较为折衷的办法?
...全文
31 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
devil_heart 2002-07-02
如果做简繁体,倒有控件可以,做中英文就不好做了,参考以下的吧:

(转载)
有外资管理背景的企业,常常要求应用软件能实现同一程序动态中英文切换,以满足中方和外方管理人员的不同需要。本文介绍一种简单实现中英文切换的方法,适用于PB的各种版本。
用户界面包括三个部分:1.菜单、窗体、窗体上的文本、按钮等各控件;2.提示信息框;3.数据内容。实现思路是将中英文对照信息分散地放在每一个对象的Tag属性上;再用递归方法遍历各种控件及其下层的子控件,对于搜索到的控件,用Tag中存放的中英文对照替换此控件的.Text等文本显示属性。
用户对象nvo_translate主要包括of_translate(a_menu,as_language)和of_translate(a_window,as_language)两个重载的递归函数,对象本身声明为Auto Intantiate。

一、首先在nvo_translate中声明一个实例变量,用于记录当前的语言:
string is_language = 'ENGLISH'

二、菜单的翻译
菜单项有一个属性数组Item[],定义了其下级的菜单项。

// 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

五、在窗单项、窗体及窗体中的每个对象的Tag属性中:
Tag = "Chinese=中文文本, English=英文文本, Help=..."
例如:
菜单:"Chinese=打开(&O), English=&Open"
窗体:"Chinese=直拨单, English=Direct Issue Voucher"
按钮:"Chinese=打印(&P), English=&Print"
文本:"Chinese=单据日期:,English=Transaction Date:"

在实际使用中,如果默认是英文显示,则Tag属性中只需要记录Chinese项,翻译过程中会自动将原来的英文文本追加到Tag中。要注意各种控件要预留足够的宽度来显示中文或英文的文字。当控件的tag属性中未定义对应的中英文信息时,也可扩充为从存放在数据库的表中或本地文件中的中英文对照表中查字典。
回复
jeking 2002-07-02
好像没什么简单好方法。
都要重新做的。
回复
bys_home 2002-07-02
表:语言
列:中文,英文
回复
eastyan 2002-07-02
对不起!出差回来了。

看来有些朋友误会了我的问题。
我指的不是‘中英文切换’,而是整个应用的‘语种变化’,
就像许多网占有语种的变化一样。

C语言 的应用比较容易,pb 应用好像无法办到????
回复
pbworm 2002-06-10
好象楼主不是要求输入法的切换吧
回复
pbworm 2002-06-10
应该不是输入法的切换吧
回复
dotnba 2002-06-10
http://www.csdn.net/expert/topic/776/776196.xml?temp=.2927667
回复
dotnba 2002-06-10
http://www.csdn.net/expert/topic/776/776196.xml?temp=.2927667
回复
FOLEX 2002-06-10
function boolean ImmSimulateHotKey (UnsignedLong hWnd,
UnsingedLong dwHotKeyID) library "IMM32.dll"
function unsignedlong GetKeyboardLayout (unsignedlongwLayout)library "
user32.dll"
function boolean ImmIsIME(unsignedLong hklKeyboardLayout)library "IMM3
2.DLL"

英文输入法切换
constant int IME_THotKey_IME_NonIME_Toggle=112
uint hklCurrent
unsignedlong hnd

hklCurrent=GetKeyboardLayout(0)
if ImmIsIME(hklCurrent) then
hnd=Handle(parent)
ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle)
end if

中文输入法切换
constant int IME_THotKey_IME_NonIME_Toggle=112
uint hklCurrent
unsignedlong hnd

hklCurrent=GetKeyboardLayout(0)
if not ImmIsIME(hklCurrent) then
hnd=Handle(parent)
ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle)
end if
回复
ddtid 2002-06-10
用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
回复
ddtid 2002-06-10
用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
回复
misslyy 2002-06-10
查找以前的帖子,有很多答案的,而且,我这里有历程,想要的话说一声,给你发过去
回复
myclife 2002-06-10
帮你UP
回复
发动态
发帖子
PowerBuilder
创建于2007-09-28

814

社区成员

PowerBuilder 相关问题讨论
申请成为版主
社区公告
暂无公告