VC2008以资源形式实现多语言版本

     越来越多的程序支持多语言切换,或者能自动适应当前系统语言,让自己开发的程序支持多语言不仅可以让自己的程序被国人使用,也能让外国程序爱好者使用。VC开发多语言程序有多种方法,或读取配置文件,或使用不同资源DLL等等。这里介绍以资源形式实现多语言版本。

1.打开Visual Studio 2008,新建一个基于对话框工程,名称为LanguageTest,不使用Unicode库 ,资源语言一共有十种(当前操作系统为Windows 7简体中文版),如下图所示:

在此选择“中文(简体,中国)”,单击“完成”按钮。
2.在对话框设计界面上,放置一个按钮(ID号IDC_SHOW_BUTTON)、一个静态文本(ID号IDC_TEXT_STATIC,必须改其默认ID号)和一个编辑框(ID号IDC_TEXT_EDIT),资源视图如下所示:

可以看到资源视图里面都是简体中文的资源文件,现在在“String Table”字符串表类型下,双击打开其子项“String Table”,默认只有一条字符串,是窗口菜单里的“关于 LanguageTest(&A)...”,如图所示:

现在点一下第二行(以黑色外框标志),新建一条字符串(值会默认增长,注意不要与已有的冲突),“标题”是“ID”号所代表的字符串内容,我们增加字符串如下图所示:

3.在“解决方案管理器”下双击打开“LanguageTestDlg.cpp”文件,在其初始化函数OnInitDialog()增加如下红色代码:

BOOL CLanguageTestDlg::OnInitDialog() 

    CDialog::OnInitDialog(); 
 
    // 将“关于...”菜单项添加到系统菜单中。 
 
    // IDM_ABOUTBOX 必须在系统命令范围内。 
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
    ASSERT(IDM_ABOUTBOX < 0xF000); 
 
    CMenu* pSysMenu = GetSystemMenu(FALSE); 
    if (pSysMenu != NULL) 
    { 
        BOOL bNameValid; 
        CString strAboutMenu; 
        bNameValid = strAboutMenu.LoadString( IDS_ABOUTBOX ); 
        ASSERT(bNameValid); 
        if (!strAboutMenu.IsEmpty()) 
        { 
            pSysMenu->AppendMenu(MF_SEPARATOR); 
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
        } 
    } 
 
    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 
    //  执行此操作 
    SetIcon(m_hIcon, TRUE);            // 设置大图标 
    SetIcon(m_hIcon, FALSE);        // 设置小图标 
 
    // TODO: 在此添加额外的初始化代码 
    CString strTemp; 
    strTemp.LoadString(IDS_SHOWBUTTON);    //LoadString读取一个ID号定义的字符串资源 
    SetDlgItemText(IDC_SHOW_BUTTON,strTemp); 
 
    strTemp.LoadString(IDS_TEXTSTATIC); 
    SetDlgItemText(IDC_TEXT_STATIC,strTemp); 
 
    strTemp.LoadString(IDS_TEXTEDIT); 
    SetDlgItemText(IDC_TEXT_EDIT,strTemp); 
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 

 

编译运行,结果如下图所示:

4.制作英文版的“String Table”。右击“资源视图”下的“String Table”子项,选择“插入副本”,在弹出的对话框选择“英语(美国)”,如下图所示:

“确定”按下之后,就会多出一个字符串资源来,并且在后面名称多了标记“[英语(美国)]”,双击打开其内容与简体中文字符串资源一样,如下图所示:

将所有字符串修改“标题”内容为英文,如下图所示:

再编译生成,此时应用程序就能适应简体中文操作系统和英文美国操作系统了,会自动显示为默认操作系统语言。可是由于此时没有英文版系统可以验证,无法确定是否完全正确,待以后验证。
5.接下去,欲使用SetThreadLocale自由切换程序界面语言,在应用程序类初始化函数InitInstance()添加如下代码:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT)); 

运行程序,出现问号乱码情况,当前Windows 7系统的显示语言只有“中文(简体)”,而“当前系统区域设置”为“中文(简体,中国)”,如下图所示:

自由切换语言失败,参考MSDN帮助文档,对的介绍说明:http://msdn.microsoft.com/en-us/library/dd374051%28VS.85%29.aspx

Windows Vista and later: Do not use SetThreadLocale to select a user interface language. The resource loader selects the resource that is defined in the .rc file with a LANGUAGE statement, or the application can use FindResourceEx. Additionally, the application can use SetThreadUILanguage. 
 
Windows 2000, Windows XP: Do not use SetThreadLocale to select a user interface language. To select the resource that is defined in the .rc file with a LANGUAGE statement, the application must use the FindResourceEx function.

另有一篇文章讨论SetThreadLocale no longer changes GUI language in Vista http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/d3a44b1c-900c-4c64-bdf8-fe94e46722e2

 

替换成如下代码:

SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); 

运行发现可以显示“英文”资源字符串,如下图所示:

可以使用GetUserDefaultUILanguage()判断当前用户界面语言,如下当用户界面语言为“简体中文”时,设置为“英文(美国)”:

if  (GetUserDefaultUILanguage() == MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED)) 

    SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)); 

 

 


 

在Windows XP简体中文版下,非Unicode程序的语言为“中文(中国)”,代码页转换表有包含“US-ASCII”,在Windows 7下未找到“代码页转换表”,使用SetThreadLocale和SetThreadUILanguage(注:静态链接然后到XP下测试的 )都能将用户界面语言设置成“英文(美国)”,如下图所示:

改变“控制面板”里面的“区域选项”语言为“英语(美国)”,则显示成问号,原因在于SetThreadLocale设置的语言与“区域选项”里面的语言一样,若是一样,则不操作,如下图所示:

 

在此中英文版本资源下,在中英文系统语言环境下,就会自动切换不同语言资源,然后在另外系统语言环境下(如:日语),就设定程序语言为英文(英文在大多数系统下都支持),代码如下:(未能完全测试)

if ((GetSystemDefaultLangID() != MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)) &&
        (GetSystemDefaultLangID() != MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)))
{
    OSVERSIONINFO ovs;
    ovs.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    if (::GetVersionEx(&ovs))
    {
        if (ovs.dwPlatformId == VER_PLATFORM_WIN32_NT && ovs.dwMajorVersion >= 6 &&
                ovs.dwMinorVersion >= 0)
        {
            SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
        }
        else
            SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));
    }
}
参考资料:

1.编写 Win32 多语言用户界面应用程序 http://msdn.microsoft.com/zh-cn/goglobal/bb688160
2.SetThreadUILanguage http://msdn.microsoft.com/en-us/library/dd374053%28VS.85%29.aspx
3.SetThreadLocale http://msdn.microsoft.com/en-us/library/dd374051%28VS.85%29.aspx
4.语言标识符常量和字符串 http://msdn.microsoft.com/en-us/library/dd318693%28VS.85%29.aspx
5.LoadString的如何确定load哪个语言的资源?http://topic.csdn.net/u/20080504/15/fb71cf4e-8420-4c1d-b89e-2784ba3dfca9.html

### 回答1: VC90动态库是指使用Visual C++ 2008编译器生成的动态链接库。VC90代表Visual C++ 2008,是该编译器的版本号。动态链接库是一种在程序运行时加载的库文件,它在多个程序之间共享代码和资源,可以提高程序的模块化和复用性。 在Visual C++ 2008中,VC90动态库有很多种类,如MFC库、ATL库等。MFC库(Microsoft Foundation Class)是一组C++类库,用于开发Windows应用程序。它提供了丰富的图形界面、窗口管理、事件处理等功能,大大简化了Windows应用程序的开发过程。ATL库(Active Template Library)是一组C++模板类库,用于开发COM组件。它提供了通用的COM接口和对象模型,方便了COM组件的开发和使用。 通过使用VC90动态库,我们可以充分利用已有的代码和资源,加快开发速度,提高程序的稳定性和可扩展性。在编译和链接时,我们需要将使用到的动态库加入到工程中,并在代码中引用相应的头文件和函数,以便使用其中的功能。 在使用VC90动态库时,需要注意以下几点。首先,要确保编译器版本与动态库版本相匹配,否则可能会出现兼容性问题。其次,要正确设置工程的库和包含目录,以便编译器能够找到相关的库文件和头文件。另外,要注意动态库的部署和打包,确保目标系统中存在所需的库文件,并设置正确的路径。 综上所述,VC90动态库是Visual C++ 2008编译器生成的动态链接库,通过使用这些动态库,我们可以方便地开发Windows应用程序和COM组件,提高开发效率和程序质量。但在使用时需要注意编译器版本、库和头文件的设置,以及动态库的部署和打包,以确保程序的正确运行。 ### 回答2: VC90动态库是指Microsoft Visual C++ 2008(简称VC 2008)生成的一系列动态链接库(DLL)文件,用于在使用VC 2008编写的程序中引用和调用库中的函数和资源。 在VC 2008中,VC90动态库主要由多个DLL文件组成,其中最常见的是msvcr90.dll和msvcp90.dll。msvcr90.dll包含了C运行时库(CRT)的函数和资源,用于支持C语言程序的运行;msvcp90.dll则包含了C++标准库的函数和资源,用于支持C++程序的运行。 使用VC90动态库需要在程序编译和链接阶段正确配置和引用相关库文件。在项目属性设置中,需要指定正确的库文件目录和库文件名称,以便编译器能够找到并链接相应的库。在代码中,需要包含相关的头文件,并在使用库中函数和资源时进行正确的命名空间和函数调用。 VC90动态库的使用可以帮助开发者充分利用已经实现的功能模块,减少代码重复,提高程序开发效率。同时,由于VC90动态库是在编译期间链接,而不是静态编译到可执行文件中,因此可以通过更新或替换库文件的方式,方便地升级和维护程序。 总之,VC90动态库是VC 2008中用于提供函数和资源的一组库文件,使用它可以方便地开发和维护VC 2008程序。 ### 回答3: VC90动态库是指使用Microsoft Visual C++ 2008编译器生成的动态链接库。VC90是指Visual C++ 2008,是一个在2008年发布的集成开发环境(IDE)和编译器套件。该版本的Visual C++支持使用C++语言进行软件开发,并且可以生成可执行文件以及动态链接库等形式的程序。 在VC90动态库中,通常会包含一些常用的函数、类、变量以及特定功能的实现。这些动态链接库可以被其他应用程序调用和使用,从而可以避免不同应用程序中重复编写相同的功能代码。通过使用动态库,我们可以提高开发效率,减少代码冗余,同时也便于维护和更新。 VC90动态库是使用Visual C++ 2008编译器编译生成的,所以在使用时需要保证对应版本的运行时库被正确安装。运行时库是一些在程序运行时需要的动态链接库,它们提供了一些常用的函数和资源,以便程序能够正确执行。因此,如果要在一台计算机上运行VC90动态库生成的程序,需要安装相应的Visual C++ 2008运行时库。 总之,VC90动态库是一种使用Visual C++ 2008编译器生成的动态链接库,它可以被其他应用程序调用和使用,提供了一些常用的函数和功能实现。在使用时需要保证对应版本的运行时库被正确安装。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值