VC++中实现多国语言的切换有什么方法
- 格式:doc
- 大小:28.50 KB
- 文档页数:2
VC下几种转换为UNICODE字符串的方法
在vc6.0的环境下,通常字符是采用ANSI方式进行编码的,而现在很多程序或者应用之间的交互,是需要采用UNICODE字符编码的。
比方说使用GDI+或者使用sqlite3的链接。
那么VC下有哪些方法,可以方便的将字符转换为UNICODE呢。
1、采用ATL中的USES_CONVERSION方法,然后采用A2W或者T2W方式进行转换,这种转换方式,主要是在堆栈中申请内存,因此不是一种很安全的方法,容易出现溢出情况。
2、直接采用MultiByteToWideChar方法,将字符串转换为Unicode字符,在进行转换之前,有一个方法,就是第一次,要转换的字符串指针位置处设置为NULL,这个时候,返回的是需要转换的字符串长度,然后申请内存再进行转换。
相对而言,这种方式需要较多手工编写代码,以及手工释放。
3、应用采用ATL中的ComBSTR类,首先申请一个空的类对象,然后用Append方法,将自己的字符串嵌入到该字符串类中,这个时候,在使用(BSTR)进行强制转换,就可以获取得到UNICODE字符串,该方法,可以避免自己手工申请内存以及释放内存。
相对比较方便。
当然_bstr_t类也是类似的。
4、如果采用了CString方法,并且采用的是非ANSI方式编译代码,那么可以用CString的SysAllocString方法,获取CString中的Unicode字符串,不过该方法需要手工释放内存单元,调用SysFreeString。
mfc 动态多语言切换的实现方法MFC(Microsoft Foundation Classes)是微软公司开发的一套应用程序框架,主要用于开发Windows平台的桌面应用程序。
在开发MFC应用程序时,实现动态多语言切换是非常重要的一个功能。
本文将介绍如何使用MFC框架来实现动态多语言切换。
一、准备工作在开始之前,我们需要准备好多语言的资源文件。
资源文件是一种特殊的文本文件,其中包含了不同语言的翻译文本。
在MFC中,我们可以使用资源编辑器来创建和编辑资源文件。
1. 打开Visual Studio,创建一个新的MFC应用程序项目。
2. 在资源视图中,右键点击项目,选择“添加”->“资源”->“字符串表”。
3. 在字符串表中,添加需要翻译的文本,并在不同语言的列中输入对应的翻译文本。
二、实现多语言切换在MFC中,多语言切换是通过改变当前应用程序的区域设置(Locale)来实现的。
区域设置指定了应用程序应该使用的语言、日期格式、货币格式等信息。
1. 在应用程序的初始化代码中,添加如下代码来设置区域设置:```// 获取当前系统的区域设置LCID lcid = GetUserDefaultLCID();// 设置应用程序的区域设置SetThreadLocale(lcid);AfxSetResourceHandle(AfxGetInstanceHandle());```2. 创建一个用于切换语言的菜单,用户可以通过菜单选择切换到不同的语言。
在菜单的消息响应函数中,添加如下代码来切换语言:```void CMainFrame::OnLanguageEnglish(){// 设置区域设置为英语(美国)SetThreadLocale(0x0409);// 重新加载资源AfxSetResourceHandle(AfxGetInstanceHandle());AfxGetApp()->LoadStdProfileSettings();// 更新界面显示UpdateUI();}void CMainFrame::OnLanguageChineseSimplified(){// 设置区域设置为简体中文SetThreadLocale(0x0804);// 重新加载资源AfxSetResourceHandle(AfxGetInstanceHandle());AfxGetApp()->LoadStdProfileSettings();// 更新界面显示UpdateUI();}```3. 在界面上的控件中,使用MFC的字符串资源宏来显示文本。
C#多语⾔实时切换的实现看了⽹上实现实时切换的⽅式,感觉真是累啊!⾃⼰写⼀个吧!⾃夸⼀句:简单,优雅,⾼效。
如果有更好的⽅式,可以跟我讲⼀声。
实现是其于C# 本⾝的本地化⽅式之上.....⽐如你已经在C# 上实现了⼆种语⾔,且⽆问题。
1. 语种管理器public enum LanguageEnum{LanguageCN,LanguageEN,}class ManageLanguage{public static ManageLanguage Instance = new ManageLanguage();ArrayList objectList = new ArrayList();/// <summary>/// 注册FORM/// </summary>/// <param name="item"></param>public void RegObject(FormBase item){if (objectList.Contains(item) != true){objectList.Add(item);}}/// <summary>/// 设置语⾔/// </summary>/// <param name="lg">语⾔种类</param>public void SetLanguage(LanguageEnum lg){switch (lg){case nguageCN:System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");CallBackLanguage();break;case nguageEN:System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("EN");CallBackLanguage();break;}}/// <summary>/// 遍历注册过的FORM,切换语⾔/// </summary>void CallBackLanguage(){//遍历所有Form,以切换其语⾔foreach (FormBase form in objectList){nguage();}}2. 语种切换接⼝public partial class FormBase : Form{public FormBase(){InitializeComponent();ManageLanguage.Instance.RegObject(this);}/// <summary>/// 语⾔切换的接⼝/// </summary>public virtual void Language(){ponentResourceManager resources = new ponentResourceManager(this.GetType()); ArrayList list = new ArrayList();FindControls(list, this);this.Text = resources.GetString("$this.Text");foreach (Control ctl in list){resources.ApplyResources(ctl, );}}/// <summary>/// 把可以本地化的控件放⼊LIST/// </summary>/// <param name="list"></param>/// <param name="ctl"></param>private void FindControls(ArrayList list, Control ctl){//容器不可以本地化if (ctl is ContainerControl){// MessageBox.Show();}else{list.Add(ctl);}if (ctl.HasChildren){foreach (Control c in ctl.Controls){if (c is Form){}else{FindControls(list, c);}}}}3. 使⽤时,只需要继承就可以了public partial class FormMain : FormBase, ICaseView {}。
多国语言编程之资源转换1. 多国语言编程之资源转换问题不同国家的人使用着不同语言的操作系统。
在Microsoft Window s下,语言用代码页来识别,不同语言用不同代码页来表示,如"简体中文"用代码页936表示,而"美国英语"则用代码页1252表示。
在用Visual C++开发应用程序时,与语种相关信息一般存储在资源文件(*.RC文件)中,因此,要编制不同语种应用程序(如中文应用程序、英文应用程序),实质上是要求编写出不同语种的资源文件。
在实际编程中,我们可将不同语种的资源文件编译成相应的动态连接库。
这样,在使用时,可根据操作系统所使用代码页异同,选用由相应语种的资源文件编译而成的动态连接库,即可使应用程序正常运行。
这就是所谓的多国语言编程问题。
在开发中文应用程序时,常要求应用程序在中文操作系统和英文操作系统+外挂汉字平台这两种环境中都能正常运行。
但由于工作环境不同,往往导致同一应用程序,在某种环境下能正常工作,在另一种环境下则不能正常工作。
如中文版的Microsoft Word软件, 在中文操作系统下能正常运行,但在英文操作系统+外挂汉字平台这种环境下, 显示的就是一堆乱码。
要解决这一问题,需为不同语种操作系统编制不同语种资源文件, 实际上这也是多国语言编程问题。
所不同的是,由于此时所显示信息并不需随语种而变(无论在哪种环境下都只显示中文信息),因此,编制多个语种资源文件可以有很简单的方法,此即本文所要讨论的资源转换问题。
该问题可简单地描述为:如果已有了某一语种的资源文件,在资源内容不变的情况下,如何将其转换为另一语种的资源文件。
例如, 已有了简体中文(代码页为936)的资源文件,在资源内容不变的情况下 ,如何将其转换为美国英语(代码页为1252)的资源文件。
2. 如何进行资源转换下面以将资源文件从代码页936(简体中文)转换到代码页1252(美国英语)为例进行说明。
winform中英文切换最简单的方法介绍在W in Fo rm应用程序开发中,有时候需要实现中英文切换的功能。
本文将介绍一种最简单的方法来实现这一功能,方便开发者进行多语言应用程序的开发。
准备工作在开始实现中英文切换功能之前,需要进行一些准备工作。
资源文件1.:创建两个资源文件,一个用于存储中文文本,另一个用于存储英文文本。
这些资源文件可以通过右键单击项目->添加->新建项->资源文件来创建。
设置窗体控件文本2.:将窗体上的所有需要切换的控件的Te x t属性值设置为对应的资源文件中的键值。
例如,如果一个按钮的Te x t属性为"确定",则在资源文件中的中文资源中添加键值对:"确定"=>"确定",在英文资源中添加对应的键值对:"确定"=>"OK"。
实现中英文切换以下是实现中英文切换的具体步骤:获取当前语言1.:创建一个静态变量`c u rr en tL an gu ag e`,用于记录当前语言。
默认情况下,将其设置为中文。
切换语言2.:当需要切换语言时,将`c u rr en tL an gu ag e`的值变更为对应的语言,例如切换为英文时将其设置为"e n"。
更新窗体文本3.:创建一个方法`U pd at e Fo rm Te xt`,用于更新窗体上所有控件的文本。
遍历窗体上的所有控件,检查其类型。
若为标签、按钮等控件,则根据`c u rr en tL an gu ag e`的值获取对应的资源文件中的文本,并更新控件的Te x t属性。
语言切换按钮4.:在窗体上添加一个按钮,用于切换语言。
为按钮的C l ic k事件添加以下代码:```c sh ar pp r iv at ev oi db tn Swi t ch La ng ua ge_C lic k(o bj ec ts en de r,E v en tA r g s e){i f(c ur re nt La ng uag e=="z h-CN")c u rr en tL an gu ag e="e n";e l sec u rr en tL an gu ag e="z h-CN";U p da te Fo rm Te xt();}```窗体加载事件5.:在窗体的Lo ad事件中调用`Up da te Fo rm T ex t`方法,确保窗体加载时显示正确的语言。
随着计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用软件的国际化,成为许多程序员关心的问题。
这种国际化问题相对使用某一种语言的用户来说,就是本地化问题。
本地化的含义比仅仅翻译菜单栏和对话框的文本内容要广泛得多,如特定文化背景的位图和图标对不同的人来说,可能会有不同的含义。
在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取得。
VC实现软件多语种支持只用一套源代码就可以方便地支持多种文字和多个地域,那么这个软件就可以方便地被翻译成本地版本,这个过程叫做地域化(Localization)。
怎样才能不修改任何源代码就使之能动态地转换到不同的地域资源上呢?那就是使用Windows的程序特性之一--资源。
把在软件中用到的可见资源维系在一个资源DLL(Dynamic Link Library动态链接库)中,就能使地域化很容易地被实现,因为它把具体的文字组件单独提取放在一个文件中,所以,一个可执行文件就可以装载几种不同的语言文字,并且选择用酒程序来装载适合的文字DLL。
创建一个CString对象的实例,并用该字串的资源标识符(string ID)调用LoadString,即可避免繁琐的字串编码工作。
[喝小酒的网摘]/a/1475.htm在大多数情况下,资源包含在应用程序的单元中,如果调用AfxSetResource Handle,就可以指向另一个不同的单元,我下面给出的StateDemo程序就是这样处理的。
调用AfxSetResource Handle,从DLL资源中采集软件所需资源,通过替换掉不同语种的DLL资源,程序便可以使用一套完全不同的资源(如String字串、Dialogue对话框、Bmp位图、Menu菜单等)。
初始情况下,作为主执行体的StateDemo不含任何资源。
首先,创建一个包含所有英文资源的DLL,在使用这个资源DLL时,应用程序就会以英文形式出现,即软件为英文版;然后,创建中文DLL,再次运行StateDemo程序,程序就以中文形式出现(即使应用程序未被重新编译)。
I. 应用程序的创建与编译(1)创建StateDemo.EXE文件(1)创建StateDemo工作区在Microsoft Visual C++ 5.0开发环境下,单击File | New选项,在创建类型选择框New中选择MFC AppWizard(exe)、Projectname:StateDemo,创建新项目StateDemo工作区,应用程序类型选择Multiple Documents,单击Finish完成工作区的建立。
C#winForm资源⽂件实现多语⾔切换C# winForm资源⽂件实现多语⾔切换这是我⽬前看到过最简单的多语⾔切换了操作步骤界⾯上的多语Step1.将界⾯Form的属性的Localizable属性设为TrueStep2.切换界⾯From的Language属性为欲使⽤的语系设完后会在分页标签上看到⽬前设定的语系Step3.设定界⾯上欲显⽰的字样并适当的调整版⾯到此,⽤资源档做的多语系程序就完成了。
我们可以到档案总管看⼀下,可看到Visual Studio⾃⼰帮我们产⽣了对应的资源档。
因此,在实作界⾯上的多语时,我们并不需⾃⼰⼿动加⼊资源档。
信息的多语上⾯的⽰例带出了界⾯上⽀持多语的写法,但却不适⽤于信息上,若要在信息上也⽀持多语。
请依下列步骤:Step1.加⼊资源档资源档依照“资源⽂件名.⽂化特性.resx”格式命名,如“Resources.zh-tw.resx”。
Step2.设定资源档内的信息内容在资源档上连点两下设定对应的语系字串Step3.使⽤资源档内的信息内容这边只要透过My.Resources去取出资源档内的值即可,内部OR Mapping转换都帮你做好好,可以⽤强型别的⽅式直接取⽤,能避免掉许多不必要的低级错误。
MsgBox(My.Resources.Resource1.String1)其实个⼈习惯是命名为“Resources.⽂化特性.resx”,因为项⽬⾥已偷放了⼀个Resources.resx资源档,因此只需加⼊⾮预设语系的资源档即可在使⽤上也会变得较为简短MsgBox(My.Resources.String1)切换语系依上⾯步骤操作完后,其实已具多语⽀持能⼒。
当程序开启时,会⾃动依照当前语系去显⽰界⾯画⾯。
因此我们开启时应该是显⽰中⽂⽽不是本来的英⽂。
若要⾃⼰切换语系可利⽤Threading.Thread.CurrentThread.CurrentUICulture。
Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo(“en”)值得注意的是,这样的写法是不会影响已开启的视窗的。
VC++中实现多国语言的切换有什么方法方法1:如果要切换,可以把资源都放到dll里,做一个简体的,比如XX0804.dll,繁体的XXX0404.dll,切换的时候用AfxSetResourceHandle选择不同的资源dll即可。
实现多语言有很多种办法, 例如楼上讲的将资源装入_DLL.你研究_MS_就会发现他也是这么做的.如何实现多语言版本程序实现多语言版本程序的一般方法是把要显示的文本以资源形式存在单独的动态链接库(DLL)中。
在这些动态链接库里,相同的文本其资源ID也相同。
这样,在运行时只要加载相应的DLL 即可,然后用LoadString API函数获取文本资源,例如:LPSTR szLang; // 此变量表示要使用的语言char szWindowTitle[256];wsprintf(szDll, "%s.dll", szLang);HMODULE hDll = LoadLibrary(szDll)LoadString(hDll, IDS_WINDOW_TITLE, szWindowTitle, sizof(szWindowTitle));通常会有多个DLLs文件,如:en.dll,cn.dll,jp.dll,fr.dll,it.dll等等,每一个语言拥有这样一个DLL支持文件。
如何去创建一个资源的实例Instance(我想问题的关键应该在这儿)然后用Load。
()去导入方法2:还有另外一种方法, 就是采用文本语言包.现在很多软件都是采用这种方式.由于在不同的语言环境下, 字体环境是不一样的, 也许你在简体中文环境下对话框看起来顺顺当当的,但切换到e文环境下,你会发现惨不忍睹.根据_MSDN的忠告, 对话框等资源的字体采用_MS_SCAN_SERIF, 9pt比较好.我说说文本语言包的实现.1.一个语言就是一个文本文件.其中最原始的是英语文本文件, 可以用这样的格式: Englisht.txt[lang]Infomation_=_English&File=&Edit=....而中文语言包文件可以这样写; Chinese.txt [lang]Infomation_=_Chinese&File=文件(&F)...&Edit=编辑(&E)对于要翻译的文件, 左边是原始文字,右边是翻译后的文字.2.程序启动时, 根据用户的选择定位到具体的语言包文件.以后每次需要显示文本时, 就从这个文件中读, 用读取_ini_文件的那个函数: GetPrivateProfileString获取字串.当然每次都这么调用, 比较麻烦, 你可以写一个类,将_SetWindowText, MessageBox等_重载一下. 这个类还可以做很多其他事情, 例如根据用户当前的语言设定特定的语言包, 例如可以随时更换语言而不必重启程序等等.当然你也可以不用类.3.要翻译的时候, 将这个文本文件直接发给翻译者就行了.这种实现文式的缺点:1.前期你要写一个简单但实用的类或API来封装一下.2.对于所有的文本, 采用的都是动态翻译,因此每个对话框都要调用_SetWindowText_重设文本, 增加程序开销.这种实现方式的优点:1.分发语言包比较方便2.翻译者翻译比较方便, 给他一个文本文件就行了.3.做多国语言包不必重新编译程序.4.一劳永逸.方法3:动态加载资源文件使用资源文件封装不同语言资源信息,包含字符串、图标等等,在应用程序运行时,载入资源就行。
VC++中实现多国语言的切换有什么方法
方法1:
如果要切换,可以把资源都放到dll里,做一个简体的,比如XX0804.dll,繁体的XXX0404.dll,切换的时候用AfxSetResourceHandle选择不同的资源dll即可。
实现多语言有很多种办法, 例如楼上讲的将资源装入_DLL.你研究_MS_就会发现他也是这么做的.
如何实现多语言版本程序
实现多语言版本程序的一般方法是把要显示的文本以资源形式存在单独的动态链接库(DLL)中。
在这些动态链接库里,相同的文本其资源ID也相同。
这样,在运行时只要加载相应的DLL 即可,然后用LoadString API函数获取文本资源,例如:
LPSTR szLang; // 此变量表示要使用的语言
char szWindowTitle[256];
wsprintf(szDll, "%s.dll", szLang);
HMODULE hDll = LoadLibrary(szDll)
LoadString(hDll, IDS_WINDOW_TITLE, szWindowTitle, sizof(szWindowTitle));
通常会有多个DLLs文件,如:en.dll,cn.dll,jp.dll,fr.dll,it.dll等等,每一个语言拥有这样一个DLL支持文件。
如何去创建一个资源的实例Instance(我想问题的关键应该在这儿)
然后用Load。
()去导入
方法2:
还有另外一种方法, 就是采用文本语言包.现在很多软件都是采用这种方式.
由于在不同的语言环境下, 字体环境是不一样的, 也许你在简体中文环境下对话框看起来顺顺当当的,但切换到e文环境下,你会发现惨不忍睹.根据_MSDN的忠告, 对话框等资源的字体采用_MS_SCAN_SERIF, 9pt比较好.
我说说文本语言包的实现.
1.一个语言就是一个文本文件.其中最原始的是英语文本文件, 可以用这样的格式: Englisht.txt
[lang]
Infomation_=_English
&File=
&Edit=
....
而中文语言包文件可以这样写; Chinese.txt [lang]
Infomation_=_Chinese
&File=文件(&F)
...
&Edit=编辑(&E)
对于要翻译的文件, 左边是原始文字,右边是翻译后的文字.
2.程序启动时, 根据用户的选择定位到具体的语言包文件.
以后每次需要显示文本时, 就从这个文件中读, 用读取_ini_文件的那个函数: GetPrivateProfileString获取字串.
当然每次都这么调用, 比较麻烦, 你可以写一个类,将_SetWindowText, MessageBox等_重载一下. 这个类还可以做很多其他事情, 例如根据用户当前的语言设定特定的语言包, 例如可以随时更换语言而不必重启程序等等.当然你也可以不用类.
3.要翻译的时候, 将这个文本文件直接发给翻译者就行了.
这种实现文式的缺点:
1.前期你要写一个简单但实用的类或API来封装一下.
2.对于所有的文本, 采用的都是动态翻译,因此每个对话框都要调用_SetWindowText_重设文本, 增加程序开销.
这种实现方式的优点:
1.分发语言包比较方便
2.翻译者翻译比较方便, 给他一个文本文件就行了.
3.做多国语言包不必重新编译程序.
4.一劳永逸.
方法3:动态加载资源文件
使用资源文件封装不同语言资源信息,包含字符串、图标等等,在应用程序运行时,载入资源就行。