转自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