vc多语言版本的配置方法和注意事项
qq:9611153 微信lgs9611153
时间:2010-2011
背景原因:
早些年曾做个翻译配置的处理,对特定文件制作中文和英文两个版本。这里提供给大家参考。
主要是对软件的界面和提示语进行两个版本的显示。
此方法适用环境:
界面不多,翻译量不大
针对特定文件进行多语言配置。
对于翻译同样也要解答这几个问题:
1、翻译什么?如何翻译?
2、何时翻译?
3、翻译字典资源如何存放?如何读取?
4、效率改进?
步骤:
1、设置语言项
配置语言选项的地方有两个:安装时,设置时。他们都可以把设置项写入注册表,只不过安装时使用脚本写入注册表,设置时直接调用api写入。
2、加载资源文件
曾使用了三种方式:
- 字符串资源文件(多种资源dll)
也比较常见,把翻译模块封装到dll中,这里不做介绍。
- 翻译文件
翻译文件可以使用xml,html,ini,cvs等个很多格式,以前选择了资源文件的形式。如下:
直接使用资源文件(扩展文件)
res\Transfer_String.htm 类型HTML 标记IDR_TRANSFER_STRING
Transfer_Player_String CLASSID$CLSID:AC664CD3-2A49-42B1-AC6F-33A05A8E38A6 STATUS_NULL$""$"" STATUS_NOVIDEO$NotVideo$无视频 STATUS_STOP$Stop$停止 STATUS_STOPPING$Stopping$正在停止 STATUS_PAUSE$Pause$暂停 STATUS_CONNECTING$Connecting$正在连接 STATUS_CONNECTFAILED$Connect Failed$连接失败 STATUS_INTERRUPT$Interrupt$中断 STATUS_TIMEOUT$Timeout$超时 STATUS_URLERROR$URL Error$URL错误 STATUS_PATHERROR$Path Error$路径错误 STATUS_FILTERERROR$Data Error$数据错误 TAGEND$TagEnd$结束 |
然后分析资源
- 直接的字符数组。
使用源文件中的数组,transfer.h
3、把翻译项保存到map
4、读取和显示
读取待翻译的词语,生成id-value对放入map中,需要的时候读取出来。
pMain->GetTx("IDC_XXX").c_str()。
例如
void C****DLg::SetControlTitle()
{
CManageClientDlg* pMain = (CManageClientDlg*)GetParent();
ASSERT(pMain!=NULL);
SetDlgItemText(IDC_CARRIERGENDER0,pMain->GetTx("IDC_UNKNOWN").c_str());
SetDlgItemText(IDC_CARRIERGENDER1,pMain->GetTx("VS_GENDOR_MAN").c_str());
SetDlgItemText(IDC_CARRIERGENDER2,pMain->GetTx("VS_GENDOR_WOMAN").c_str());
SetDlgItemText(IDC_COUNTRY,pMain->GetTx("ID_CHINA").c_str());
}
注意事项:
需要综合考虑专业和美观的问题
不同语言的文字长度不一致,需要进行实际的测试和调整,才能使界面美观完整。
系统控件有些是有操作系统决定的,可能需要自定义或者特殊配置。比如日历控件,系统弹出框等。
如果获取不到资源,可以使用界面上的原始界面替代
中文显示乱码是设计问题。如果操作系统安装有中文字库自然不是乱码。
双字节,多字节字符编码问题,需要翻译资源和源文件使用相同的字符集。