1. 修改项目
1.1 C++Builder中要使用两个文件gnugettext.pas 和 gnugettext.hpp,将前者加入项目。
1.2 在Project.cpp的Application->Initialize();之前加入TP_GlobalIgnoreClassProperty(__classid(TAction), "Category");
和TP_GlobalIgnoreClass(__classid(TFont));等,gettext在翻译时会忽略掉这些属性和类。
1.3 在Form::OnCreate事件中加入TranslateComponent(this);翻译本窗口的所有控件。
2. 生成.po文件
2.1 右键项目目录,点击菜单“GG Extract translations to template”,将生成一个default.po。
2.2 gettext会遍历所有项目文件(.pas, .cpp, .c, .dfm,但不包含头文件?),为源代码中需要翻译的字符串(“_(...),或gettext(...)等”)
以及.dfm中所有控件的String属性(不包括Name)生成翻译项,注意:TP_GlobalIgnoreClassProperty和TP_GlobalIgnoreClass只在程序运行时起作用,
它们是基于类型系统工作的,无法过滤掉.dfm中不需要翻译的类和属性。
2.3 如果已经有旧的.po文件,可以将新抽取出来的.po文件合并到旧的.po文件中,方法是右键旧的.po文件,点击菜单“Merge Template”。
3. 翻译.po文件
3.1 可以使用poedit或者gorm翻译.po文件。gorm支持label机制,可以将步骤2.2中那些无法过滤的.dfm中的类和属性标记为ignore,然后将其分离到ignore.po文件中,
在将新的.po文件合并到旧的(已翻译的).po文件之前,使用msgremove命令将ignore.po文件中的翻译项从新的.po文件中移除。
3.2 另外一个小工具IgnoreEditor.exe可以打开两个文件default.po和ignore.po,然后可以快速地在两个文件之间移动翻译项。
3.3 可以右键default.po文件,点击菜单“Compile to mo file”生成.mo文件,poedit和gorm中也可以直接将.po文件编译成.mo文件(后者需要将gorm.exe置于gettext目录下)。
4. 项目发布
4.1 将.mo文件置于.exe所在目录的“locale/**/LC_MESSAGES/”子目录下,其中"**"为两个字符的语言代码,或者语言代码和国家代码的组合。
4.2 也可以将.mo文件内置于.exe文件中,右键.exe文件,点击菜单“Embed translations”。
5. 存疑
5.1 gettext默认使用default domain(即使用default.mo文件),但可以通过调用“textdomain()”或者"dgettext(domainname, str)"自己指定domain,
但似乎const string字符串依然还在default domain中(资源文件中的字符串也是,但可以调用“AddDomainForResourceString()”来增加查找域)。
5.2 有多个应用程序时,是使用一个.mo文件还是分割成多个.mo文件?多个项目有公用的部分又该怎么办?
5.3 应用程序本来是中文的,怎么翻译?FAQ中说,可以先提取出所有中文翻译项,然后将程序翻译成英文,然后重新提取出所有英文翻译项,最后将两个.po文件合并成一个。






这山望着那山高