vc 多国语言方案

转自http://blog.sina.com.cn/s/blog_5ea0192f0100erem.html


手工编译纯资源成dll:
Rc.exe /v data.rc
Cvtres.exe /machine:ix86 data.res
Link /SUBSYSTEM:WINDOWS /DLL /NOENTRY data.res ;编译成DLL文件
这种方式创建的DLL是最小的,比起你用Win 32 Dynamic Libray等产生的更小。

///////////////////////////////////////////////////////////////////////////

 

怎么把.rc文件编译成.dll文件阿

新建一个dll工程,替换掉rc

 

/////////////////////////////////////////////////////////////////////////

把你现在的.rc保存,然后把所有的中文换成其他语言,别存为其他other.rc。

GetResourceInstance()得到资源句柄。换成另other.rc,(SetResourceHandle)

就可以搞定。

因为所有的id没变,所有程序都能正常运行。

最好把资源做成dll,用LoadResource切换

写成INI也是一个好办法!

 GetSystemDefaultUILanguage

getSystemLanguage

GetSystemDefaultLangID

 GetSystemDefaultLCID

 The functions AfxFormatString1 and AfxFormatString2 can be useful in formatting text that appears in a message box

 

///////////////////////////////////////////////////////////////////////////

请各位大侠指教!我有三个RC文件(每一个都是完整的),分别是Simplified,Traditional,English,将T和E组合(不用DLL!!!),在繁体OS下编译,EXE文件在繁体OS下显示Traditional   resource,在英语及简体OS下显示English   resource(已实现).我现在想T+S+E组合,在繁体OS下编译,使EXE能在简体OS下显示Simplified   resource,繁体OS下显示Traditional   resource,英语OS下显示English   resource,能实现否?(Dll   is   inconsiderable   for   some   reason!)(判断OS版本行不通,除非在.rc文件中识别)

 

问题已解决!通过修改RC文件中LANGUAGE,code_page等来实现。

 

 

///////////////////////////////////////////////////////////////////////////

http://www.99inf.net/SoftwareDev/VC/39455.htm

///////////////////////////////////////////////////////////////////////////

 

一。   把所有的资源都放到动态库中,一种语言一个动态库,程序运行的时候通过加载不同的动态库来实现多语言功能.

缺点是不能动态切换语言,如果更换语言后必须重新启动软件。

如果程序需要修改资源的话,就要更新所有的动态库,容易出现疏漏。

                  

思路:

1.       每个DLL里面都是一个大的string table, 这些DLL在程序安装时拷贝到指定的目录中

2.       每一个用到的字符串都指定了一个固定ID,在不同的DLL中这个ID对应了这个字符串的不同语言的翻译版本。这样每当需要这个字串时就通过ID去获取,在当时程序加载的某一特定语言的DLL,就可以取到相应语言的字串。

3.       英文版本的string table编译在主EXE文件中,这样当某一语言不支持,或DLL文件加载失败时还可以使用英语版本。

 以emule为例,主要实现代码在I18n.cpp文件中。入口函数是 void CPreferences::SetLanguage() ,这个函数在在 void
CPreferences::LoadPreferences() 函数中被调用,即载入了程序的各种选项后。

 

///////////////////////////////////////////////////////////////////////////

http://www.vckbase.com/document/viewdoc/?id=663

////////////////////////////////////////////////////////////////////////////                 

二。      把所有用到的字符串都放到文件中,一种语言一个文件,根据选择的语言到对应的文件中去加载字符串。这样不但可以动态切换语言,而且用户可以根据需要自己添加新的语言。

 

具体实现:

1、程序启动时检查所选择的语言,确定该语言文件,保存该文件路径

 

2、提供一个全局函数,如 g_LoadString(CString szID),根据提供的字符串ID返回其内容,具体是哪个语言的在函数中判断,这样在程序中只要提供一个字符串ID就可以自动加载不同语言的文字了。

 

3、如何在程序中使用:
原来代码:

CString str;

str = "语言";

改动后:

CString str;

str = g_LoadString("IDS_LANGUAGE");

 

4、对话框中如何实现

如果像在程序中使用一样,每一个字符串都要去加载一次的话,如果对话框比较多,工作量可就太大了。

 

所以我提供了一个函数g_SetDialogStrings(CDialog *pDlg,UINT uDlgID),每个对话框在初始化的时候调用该函数,传递对话框的指针,我在函数中循环枚举所有的子控件,逐个设置文字。这样就可以省去很多工作

 

注意:由于静态文本(CStatic)默认的ID是IDC_STATIC,值都是65535,无法区分,所以在需要改变其文字的CStatic的ID要改一改,不能用默认的

    

5、语言文件样例:

中文版:

[Setting]

Language=Chinese

 

[String]

IDS_MENU_FILE=文件

IDS_MENU_FILE_NEW=新建(&N)

IDS_MENU_FILE_OPEN=打开(&O)

IDS_MENU_FILE_CLOSE=关闭(&C)

IDS_MENU_FILE_EXIT=退出(&E)

 

英文版:

[Setting]

Language=English

 

[String]

IDS_MENU_FILE=File

IDS_MENU_FILE_NEW=&New

IDS_MENU_FILE_OPEN=&Open

IDS_MENU_FILE_CLOSE=&Close

IDS_MENU_FILE_EXIT=&Exit


你可能感兴趣的:(vc 多国语言方案)