随着
计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用
软件的国际化, 成为许多程序员关心的问题。 这种国际化问题相对使用某一种语言的用户来说, 就是本地化
问题。 本地化的含义比仅仅翻译菜单栏和对话框的文本内容要广泛得多, 如特定文化背景的 位图和图标对不同的人来说,可能会有不同的含义。在 Windows 系统中,应用程序开发者 可以通过利用 VC 动态链接库,只用一套
源代码就能简洁地支持多种文字。本文介绍用 VC 的资源动态链接库解决国际化问题的具体方法和步骤。 实现技术 利用 VC 编程,可以把所有的可见资源封装在一个资源动态链接库中,以简化本地化工 作。一般情况下,资源包含在应用程序中,但也可以通过调用 AfxSetResourceHandle 函数指 向一个不同的单元以完成资源的引用。 本文例程就是首先调用该函数从动态链接库中采集到 所有的应用程序可用资源,然后通过调用 GetSystemDefaultLangID 函数判断系统默认语种, 以载入不同语种的资源动态链接库实现界面与系统的自动适应。 为说明清楚,本文创建了一个默认语种为简体中文的 Languages 应用程序。该程序不含任何 资源, 应用程序根据系统的语种设置连接对应的资源链接库, 以完成对中文和英文两种语言 的支持。 实现步骤 1.创建 Languages 执行体 首先,用 MFC AppWizad(exe)创建新项目的工作区,选择 Simple Document 类型、中国 中文(其他的选项选择缺省),并且为了明确,将工作区目录改为“多语种支持”。 2.添加数据成员 由于要动态地装入资源链接库, 所以需要保存链接库的句柄以便在程序结束的时候释放 资源。将下述数据成员添加到 CLanguagesApp 类中: protected: //资源链接库句柄 HINSTANCE m_hLangDLL; 3.修改 InitInstance 函数 应用程序需要判别
系统的缺省语种,并装入对应的资源链接库。将下面的代码加到 InitInstance 函数中: BOOL CLanguagesApp::InitInstance() { AfxEnableControlContainer(); // 判定系统缺省语种 WORD wLangPID=PRIMARYLANGID(::GetSystemDefaultLangID()); // 载入资源动态链接库 switch( wLangPID ) { case LANG_CHINESE: m_hLangDLL=::LoadLibrary(“chinese.dll”); break ; default: m_hLangDLL=::LoadLibrary(“english.dll”); break; } if( !m_hLangDLL)
{ AfxMessageBox(_T(“无法装载资源链接库!”)) ; return FALSE ; } // 连接资源 AfxSetResourceHandle(m_hLangDLL) ; …… } 其中,操作系统所使用的默认语种由 Win 32 函数 GetSystemDefaultLangID 取得。宏 PRIMARYLANGID 取出主语言标识符进行判断,以正确选择应该调用的链接库。链接库的 加载由 Win 32 函数 LoadLibrary 实现。 程序中所使用的资源库由 AfxSetResourceHandle 函数 指定。 4.处理 ExitInstance 函数 程序
退出时使用 Win 32 函数 FreeLibrary 卸载已经装入的动态链接库。将下列代码添加 到 ExitInstance 函数中: int CLanguagesApp::ExitInstance() { // 释放资源链接库 if(m_hLangDLL) AfxFreeLibrary(m_hLangDLL); return CWinApp::ExitInstance(); } 5.修改 OnDraw 为了说明是从资源链接库中动态地获取数据而不是从程序的执行体中获取, 该
程序从资 源链接库中获取了一个图标和一个字符串,并绘制在屏幕上。下面是主要代码: void CLanguagesView::OnDraw(CDC* pDC) { CLanguagesDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //画出从链接库加载的图标 pDC->DrawIcon(10,10,AfxGetApp()->LoadIcon(IDR_MAINFRAME)); //显示字符串 CString strMsg; strMsg.LoadString(IDS_HELLO); pDC->TextOut(60,15,strMsg); } 6.从项目中移走 Languages.rc 由于本文项目自身并不需要含有任何资源, 所以从项目
列表文件中移走 Languages.rc 文 件(并不删除) 。ClassWizad 不允许项目不包