但是悲剧的是,gettext好像要求主语言是英文,对中文字符串支持的不是很好。所以我就用C#自己写了一个gettext,你可以在本文的附件里下载它,命令的格式是:
Zgettext -k T -i 源代码路径名 -o 输出的po文件名
Zgettext -k T -f 源代码路径列表文件 -o 输出的po文件名
比如:
Zgettext -k T -i AccountController.cs -o test.po
4. 生成的po文件格式其实非常简单易懂:
- #: C:\workspace\Views\Role\Edit.cshtml:9
- msgid "管理用户组"
- msgstr ""
- #: C:\workspace\Views\Role\Edit.cshtml:23
- msgid "用户组[{0}]的权限"
- msgstr ""
Msgid就是要翻译的句子,msgstr就是翻译好的句子。
5. 完成翻译后,使用一个辅助程序msgfmt将翻译好的po文件转换成ASP.NET支持的格式。因为原始的gettext程序包里的msgfmt.exe好像不能生成ASP.NET识别的.resources文件,所以 我也写了一个msgfmt程序完成这个工作——在本文的附件里可以下载到,命令格式是:
Msgfmt -o 输出的resource文件路径 -i 输入的po文件路径
例如:
Msgfmt -o website.en-US.resources -i website.po
注意:输出的resource文件名,必须与你在第一步里,使用HttpContext.GetGlobalResourceObject函数的第一个参数相同。
6. 我写了一个小的批处理,将3、4、5步结合在一起执行:
- pushd src
- del /F source.lst
- dir /s /b src\*.cs >> source.lst
- dir /s /b src\*.cshtml >> source.lst
- tools\zgettext\zgettext\bin\Debug\zgettext.exe -k T -f source.lst -o glob\website.po
- tools\zgettext\msgfmt\bin\Debug\msgfmt.exe -o src\App_GlobalResources\website.resources -i glob\ website.po
- popd
希望对你有点帮助。