求教多语言版本支持程序(200分)

  • 主题发起人 主题发起人 xanadu
  • 开始时间 开始时间
X

xanadu

Unregistered / Unconfirmed
GUEST, unregistred user!
如何开发支持多语言程序的VC应用程序,求教如何实现。
参与者有分。
 
如何开发支持多语言应用程序,ding
 
VC简单编程实现多语言菜单
(加入日期:2003-8-5 点击数:752)
【对此文发表评论】 【编程爱好者论坛】 【保存文章至硬盘】 【打印文章】
Borland开发讨论区 微软开发讨论区 C/C++讨论区 新手入门专区

随着计算机技术的快速发展,软件的交流越来越频繁,软件的国际化已成为一个软件开发人员不可回避的一个问题。所谓软件的国际化,就是让软件界面支持多种语言,从而可以被很多国家的人使用。为了使应用程序支持多种语言,一个很好的办法就是使用动态链接库,将不同的语言资源放入不同的库中,根据需要程序加载不同的动态库,从而实现程序的国际化。但是这种方法实现起来不很方便,对软件开发人员要求较高,不适宜初学者。为了解决这个问题,以实现多语言菜单为例,笔者介绍在VC编程中一种简单实现方法,从而实现软件的国际化支持。
在VC6.0中生成一个单文档应用程序,其它采用默认项目,项目生成后,默认的菜单为中文,为了使菜单支持别的语言,用文本形式打开项目中的资源文件(.rc文件),找到项目中的菜单文本内容如下:
IDR_MAINFRAME MENU PRELOAD DISCARDABLE
begin
POPUP "File(&F)"
begin
MENUITEM "New(&N)tCtrl+N", ID_FILE_NEW
MENUITEM "Open(&O)...tCtrl+O", ID_FILE_OPEN
MENUITEM "Save(&S)tCtrl+S", ID_FILE_SAVE
MENUITEM "Save as(&A)...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "Print(&P)...tCtrl+P", ID_FILE_PRINT
MENUITEM "Print Preview(&V)", ID_FILE_PRINT_PREVIEW
MENUITEM "Print Setting(&R)...", ID_FILE_PRINT_SETUP
MENUITEM SEPARATOR
MENUITEM "Recent Files", ID_FILE_MRU_FILE1, GRAYED
MENUITEM SEPARATOR
MENUITEM "Exit(&X)", ID_APP_EXIT
END
.......................................
END

将上述内容复制一份,拷贝到该资源文件的后面,将上面内容的第一行修改为“IDR_MAINFRAME_ENGLISH MENU PRELOAD DISCARDABLE”,这样作也就是为英文菜单起了一个叫“IDR_MAINFRAME_ENGLISH”的名字。最后将拷贝内容的每一项目中的MENUITEM部分改为英文即可,例如,对于“文件/打开”菜单来说,修改为“MENUITEM "Open(&O)...tCtrl+O", ID_FILE_OPEN”,对资源文件中后续拷贝的每一个菜单项修改后,保存资源。下面要作的是在程序的CMainFrame类中加入变量CMenu m_CurrentMenu对象,用来装载中文或英文菜单资源;另外,还需要加入枚举变量enum Enum{e,c}m_Current,并给它一个初始值"c",当m_Current等于 "c"时说明项目选用中文菜单,等于"e"时说明项目选择了英文菜单。
下面在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加代码实现装入英文菜单资源
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
..................................//加载工具条和状态条的代码;
if(m_Current= = c)
m_CurrentMenu.LoadMenu("IDR_MAINFRAME_ENGLISH");
else
m_CurrentMenu.LoadMenu(IDR_MAINFRAME);

SetMenu(&m_englistmenu);//设置界面菜单;

return 0;
}
开发人员可以通过设置m_Current的不同值,将程序编译成不同的语言版本,上述代码在Windows 98和Visual C++6.0编译环境下通过测试,实现了多语言菜单,有兴趣的读者可以自己上机试一试。
(合肥 刘涛)
 
http://www.csdn.net/develop/read_article.asp?id=10545
通过ini实现多语言菜单
下载本文的演示及源代码(26K)

从前看过vc知识库上一篇《实现多语言菜单》的文章。那篇文章里采用的方法是在资源里定义两个菜单,一个英文,一个中文...
要是程序要作成100国语言的用那种方法就十分不妥了。原因是软件作者不可能会100国语言....最主要的是那样十分不方便!
最好的办法就是把菜单存到ini文件里,由用户自行定义菜单(要改成什么就改成什么)。

下面111222尝试用ini储存菜单做了一个演示工程。实现了通过ini修改菜单项,通过这个你可以轻松的修改菜单的语言,内容,更主要的是你可以把这些工作交给热心的用户....当然,这只是简单的实现,还存在两个问题,希望你能够帮我完善它。

首先,要修改菜单项,你要熟悉CMenu的几个函数。

GetMenuItemCount();
//获取菜单项数目
GetMenuItemID(UNIT i);

//获取菜单项i的ID,这里ID为0代表分割线,-1为POPUP菜单项。
GetMenuString( UINT nIDItem, CString&
rString, UINT nFlags );
//获取菜单项的字符串
ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
//修改菜单项,这里我们主要是修改第4个参数,改变菜单的文字。

接下来我写了一个函数,利用递归遍历所有的菜单项按照ini文件的设置修改菜单项:

//函数声明 MainFrm.h
void InitMenu(CMenu* menu);

/////////////////////////////////////////////////
//功能:多语言菜单 MainFrm.cpp
//原理:遍历菜单项,替换菜单项文字为ini文件中的对应值
//// by 111222 9月13日
/////////////////////////////////////////////////
void CMainFrame::InitMenu(CMenu* menu)
{
if(menu==NULL)
return;
int nCount = menu->GetMenuItemCount();//获取该层菜单数
for(int i=0;i<nCount;i++)//遍历所有菜单项
{
int id = menu->GetMenuItemID(i);//查看菜单属性,id=0为分割线,-1为popup菜单
if(id==0)
{}
else
if(id==-1)
{
CString strText;
menu->GetMenuString (i, strText, MF_BYPOSITION);//获取菜单文字
CString cs = AfxGetApp()->GetProfileString("menu",strText,strText);//读取菜单项在ini里的文字
menu->ModifyMenu(i,MF_STRING|MF_BYPOSITION,id,cs);


// 下面这行可有可无,用这个免得我们手工编辑ini,发布的版本里注释掉
//AfxGetApp()->WriteProfileString("menu",strText,cs);

CMenu* pSub = menu->GetSubMenu(i);
InitMenu(pSub);//递归,遍历popup菜单
}
else
{
CString strText;
menu->GetMenuString (i, strText, MF_BYPOSITION);
strText.Replace(_T('/t'),_T('_'));//解决'/t'无法使用GetProfileString的问题
CString cs = AfxGetApp()->GetProfileString("menu",strText,strText);
cs.Replace(_T('_'),_T('/t'));//把上面的replace再变回来
menu->ModifyMenu(i,MF_STRING|MF_BYPOSITION,id,cs);


// 下面这行可有可无,用这个免得我们手工编辑ini,发布的版本里注释掉
// AfxGetApp()->WriteProfileString("menu",strText,cs);
}
}
}

函数的调用:
在CMainFrame::OnCreate的中填加上

//multi language menu
CMenu* pMenu = GetMenu();
InitMenu(pMenu);

至此通过ini实现多语言菜单结束了。
具体可以看演示程序。
menu.ini中储存着每个菜单项的文字,你只需要修改值就可以改换菜单语言。
上面程序的不足:
没能修改Prompt的文字(就是在状态栏上显示的提示)
这个不足我还没有着手解决,希望能解决的也给我些提示 111222@0451.com。
 
后退
顶部