越来越多的程序支持多语言切换,或者能自动适应当前系统语言,让自己开发的程序支持多语言不仅可以让自己的程序被国人使用,也能让外国程序爱好者使用。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.aspx3.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

window国际化文案的更多相关文章

  1. 结合webpack 一步一步实现懒加载的国际化简易版方案

    想法来源于工作需求,最后倒腾出一个国际化工作流,期望是这样的: 1. 自动化处理国际化文案(表现为转义翻译人员给到的文件处理成技术人员所识别的文件) 2. 转化后的国际化文件能够按需加载,实现懒加载的 ...

  2. 使用create-react-app+react-router-dom+axios+antd+react-redux构建react项目

    1.安装.构建 # 全局安装 npm install -g create-react-app # 构建一个my-app的项目 npx create-react-app my-app cd my-app ...

  3. Validation框架的应用

    Validation框架的应用 一,前言 这篇博客只说一下Validation框架的应用,不涉及相关JSR,相关理论,以及源码的解析. 如果之后需要的话,会再开博客描写,这样会显得主题突出一些. 后续 ...

  4. 死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  5. 死磕Spring之IoC篇 - Spring 应用上下文 ApplicationContext

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  6. php nginx window系统 gettext方式实现UTF-8国际化多语言(i18n)

    开始应用: 步骤一:搭建环境(服务器已经完成,环境已经搭建好了) 1.首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后 ...

  7. JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP

    网页框架类APP实现国际化参考文案一 参考:https://blog.csdn.net/CSDN_LQR/article/details/78026254 另外付有自己实现的方法 本人用于H5版的AP ...

  8. swift——启动页国际化:一步一步动态加载启动页图片,启动的时候加载文字

    由于公司的需求,要求做一个国际化的启动页,因为app我也弄国际化了,就剩下启动页国际化未完成,百度了呵谷歌了好多答案都不尽如人意,最后也是看见同事完成,我也问了具体的做法,决定分享给需要的人,免得和我 ...

  9. WPF 实际国际化多语言界面

    前段时候写了一个WPF多语言界面处理,个人感觉还行,分享给大家.使用合并字典,静态绑定,动态绑定.样式等东西 效果图 定义一个实体类LanguageModel,实际INotifyPropertyCha ...

随机推荐

  1. NativeExcel 读取文件

    class function T_EShopDataBill.ImportData(const AFileName: String; AList: T_EShopDataModelList; var ...

  2. Oracle SGA参数调整

    一. SGA的组成: 自动 SGA 管理后,Oracle 可以自动为我们调整以下内存池的大小: shared pool buffer cache large pool java pool stream ...

  3. 怎样下载安装Firebug和使用Firebug

    Firebug是基于火狐(FireFox)浏览器的一个插件,它的作用是给Web页面开发者一个很好的测试前端页面代码的工具.所以深受网页开发者或网页布局爱好者的喜爱.像我们用DIV+CSS和html所写 ...

  4. C语言的32个关键字

    由ANSI标准定义的C语言关键字共个: auto double int struct break else long switch case enum register typedef char ex ...

  5. win 7 64位如何安装erdas 9.2

    最主要的就是crack包必须包含这三个文件:erdas.exe、license.dat和lmgrd.exe 将这三个文件都复制到C盘安装目录下bin中,其余安装同win 7 32位系统

  6. XSS 复合编码 续

    对上文 [web安全]第二弹:XSS攻防中的复合编码问题 的一些补充,思路来源于:http://escape.alf.nu/3/ html解码的问题: 通过appendChild添加的节点,不会被HT ...

  7. 【BZOJ 2654】tree

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  8. Java中的break与continue区别

    break跳出当前循环执行循环下面的程序, 如果break出现在嵌套循环的内层循环, 则break语句只会跳出当前层的循环; 当程序执行到continue时时, 则跳过本次循环程序重新回到循环开始继续 ...

  9. NOSQL Mongo入门学习笔记 - MongoDB的安装(一)

    手上的工作不是很忙,所以来学习学习很久就像接触的MongoDb,无奈前段时间工作时间都比较多.记录在这里供以后参考 环境: Centos 7 64位 开始: 1. 在官网下载Mongo : wget  ...

  10. [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg

    在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...