.NET开发系列工具之NDoc:让NDoc支持简体中文!(含修改了的源代码)

关于NDoc,无论是在博客园还是其它技术网站,都有大量的介绍,这里不介绍其功能(除非有大量网友要求我这样做),只给大家实现其对简体中文的支持。

NDoc缺省不支持简体中文,编译出来的chm文档(MSDN类型)显示的中文以“?”代替了。用google搜索了整个互联网,只有percyboy(破宝)弄了一个广泛流传的1.2简体中文安装版本,没有源代码,现在NDoc官方都出到1.31了,提供了一些新功能,改进了原来很多bugs。

在1.31中,用户可以直接选择LangID。

我很是着急,所以把NDoc的1.3 nightly-dev-build(最新开发版本,不稳定)拉了下来,最简单的方法是跟踪,一跟踪就发现了关键:原来每个documenter(姑且称之为“文档器”)都有一个config(配置),里面有一个LangID(语言ID),初始化和缺省都为1033(英文),只需要把这2个地方改为2052便可,如下:

        short _LangID = 2052;

        
/// <summary>Gets or sets the LangID property</summary>
        
/// <remarks>The language ID of the locale used by the compiled helpfile</remarks>

        [Category("HTML Help Options")]
        [Description(
"The ID of the language the help file is in.")]
        [DefaultValue((
short)2052)]
        [Editor(
typeof(LangIdEditor), typeof(UITypeEditor))]
        
public short LangID
        
{
            
get return _LangID; }

            
set
            
{
                _LangID 
= value;
                SetDirty();
            }

        }
    

文件分别为Msdn工程中的MsdnDocumenterConfig.cs和Msdn2工程中的Msdn2DocumenterConfig.cs

修改后实现了简体中文的显示。破宝汉化的版本还把一些关键字汉化了。要进行彻底汉化,还需要对大量的xslt文件进行汉化。

为了方便大家,我再进一步,把这些xslt都进行汉化,当然还有对应的documentor里面的代码了。

这里只给大家一个思路,具体应用,请根据自己的实际情况做选择。

需要自行编译的网友,必须先下载VSHIKhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/hwmscextendingnethelp.asp并安装之。

我修改的版本,只汉化了MSDN类型,点击这里下载。
posted @ 2005-06-21 13:32 灵感之源 阅读(4351) 评论(13)  编辑 收藏 网摘 所属分类: 3.开源项目

  回复  引用    
#1楼 2005-06-21 14:05 | fly_bluewolf [未注册用户]
我也研究过,记得好像是把每个documenter中的bulid函数中
//Get an Encoding for the current LangID
CultureInfo ci = new CultureInfo(MyConfig.LangID);
currentFileEncoding = Encoding.GetEncoding(ci.TextInfo.ANSICodePage);
改为
currentFileEncoding = Encoding.UTF8;
就可以正常显示中文,不会有???显示了
  回复  引用  查看    
#2楼 [楼主]2005-06-21 14:08 | 奋斗中的灵感之源      
你的方法不错
  回复  引用  查看    
#3楼 2005-06-21 14:55 | AlleNny      
我用NDoc从来没成功过,每次都是以异常而告终。我的代码里都没有中文的。郁闷
  回复  引用    
#4楼 2005-06-21 17:08 | SW515 [未注册用户]
To 楼主:
  呵呵,送佛送到西吧!

  楼主既然您已经开始这个汉化的工作了,那么就干脆把所有的生成信息都汉化完吧!免得生成的文档中英文混杂,看起来实在是不够专业啊!

嘿嘿~这个要求有些“无耻”了…… ^oo^"
  回复  引用  查看    
#5楼 2005-06-21 19:48 | NetCobra      
其实在1.3版本中这个1033值可以在NDoc GUI里面修改的,在MsdnDocumenterConfig.cs和Msdn2工程中的Msdn2DocumenterConfig.cs中的修改只是修改默认值而已。
  回复  引用  查看    
#6楼 2005-06-21 19:52 | NetCobra      
另外,fly_bluewolf 的方法生成的CHM文件使用的是UTF编码,可能在Win9x上显示会有问题。

不过现在还有在Win9x上进行开发的.Net程序员吗? :-P
  回复  引用    
#7楼 2005-06-21 22:15 | 寒枫天伤 [未注册用户]
啊,天才呀....

赞同SW515 所说,送佛送上西天吧,嘻嘻....
  回复  引用    
#8楼 2005-06-22 19:45 | dagco [未注册用户]
晕,把语言设置一下就支持简体中文
  回复  引用  查看    
#9楼 [楼主]2005-06-22 20:40 | 奋斗中的灵感之源      
to:dagco
真正的中文支持包括中文的内容,譬如xxx Class中文应该是xxx 类
  回复  引用    
#10楼 2005-07-05 15:51 | Jeky [未注册用户]
老兄在辛苦一下,搞个纯中文的吧
  回复  引用    
#11楼 2005-07-27 02:07 | 丁翊 [未注册用户]
我想请问我项目全部编译完成后,怎样使用呢?
  回复  引用    
#12楼 2005-08-23 17:16 | Jarod [未注册用户]
NDoc 1.3本身就可以选择语言代码,但选了中文后,文档里的空间都变成?号了
  回复  引用  查看    
#13楼 2005-09-20 19:33 | Kinbor      

大哥 ,为什么下不到你改的源码,偶的mail:kinbor@gmail.com 谢谢
还有一个事有人改了这个代码,实现某些默认方法不显示,但没效果,我跟了下也不知道问题在哪里
在MsdnDocumenter.cs中的方法:MakeHtmlForMethods。修改如下:
private void MakeHtmlForMethods(WhichType whichType, XmlNode typeNode)
{
XmlNodeList declaredMethodNodes = typeNode.SelectNodes("method[not(@declaringType)]");

if (declaredMethodNodes.Count > 0)
{
bool bOverloaded = false;
string fileName;

string typeName = typeNode.Attributes["name"].Value;
string typeID = typeNode.Attributes["id"].Value;
XmlNodeList methodNodes = typeNode.SelectNodes("method");
int nNodes = methodNodes.Count;

int[] indexes = SortNodesByAttribute(methodNodes, "id");

fileName = GetFilenameForMethods(whichType, typeNode);
htmlHelp.AddFileToContents("Methods", fileName);

XsltArgumentList arguments = new XsltArgumentList();
arguments.AddParam("id", String.Empty, typeID);
arguments.AddParam("member-type", String.Empty, "method");
TransformAndWriteResult(xsltIndividualMembers, arguments, fileName);

htmlHelp.OpenBookInContents();

// 鞠强添加的部分
string[] skipped = new string[]{"Equals","Finalize","GetHashCode","GetType","MemberwiseClone","ToString","GetObject"};
// 添加完成


for (int i = 0; i < nNodes; i++)
{
XmlNode methodNode = methodNodes[indexes[i]];
string methodName = (string)methodNode.Attributes["name"].Value;
string methodID = (string)methodNode.Attributes["id"].Value;

// 鞠强修改:
// 目的是不显示如下7个Object的方法:
// Equals
// Finalize
// GetHashCode
// GetType
// MemberwiseClone
// ToString
// GetObject
int qq = 0;
for(qq=0;qq<skipped.Length;qq++)
{
// 如果在上述范围之内,就不处理
if(methodName == skipped[qq])break;
}
if(qq<skipped.Length)continue;
// 修改完毕

if (IsMethodFirstOverload(methodNodes, indexes, i))
{
bOverloaded = true;

fileName = GetFilenameForMethodOverloads(typeNode, methodNode);
htmlHelp.AddFileToContents(methodName + " Method", fileName);

arguments = new XsltArgumentList();
arguments.AddParam("member-id", String.Empty, methodID);
TransformAndWriteResult(xsltMemberOverload, arguments, fileName);

htmlHelp.OpenBookInContents();
}

if (methodNode.Attributes["declaringType"] == null)
{
fileName = GetFilenameForMethod(methodNode);

if (bOverloaded)
{
XmlNodeList parameterNodes = xmlDocumentation.SelectNodes("/ndoc/assembly/module/namespace/" + lowerCaseTypeNames[whichType] + "[@name="" + typeName + ""]/method[@id="" + methodID + ""]/parameter");
htmlHelp.AddFileToContents(methodName + " Method " + GetParamList(parameterNodes), fileName,
HtmlHelpIcon.Page );
}
else
{
htmlHelp.AddFileToContents(methodName + " Method", fileName,
HtmlHelpIcon.Page );
}

XsltArgumentList arguments2 = new XsltArgumentList();
arguments2.AddParam("member-id", String.Empty, methodID);
TransformAndWriteResult(xsltMember, arguments2, fileName);
}

if (bOverloaded && IsMethodLastOverload(methodNodes, indexes, i))
{
bOverloaded = false;
htmlHelp.CloseBookInContents();
}
}

htmlHelp.CloseBookInContents();
}
}






标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-07-06 13:21 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: