Spiga

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

2005-06-21 13:32 by 灵感之源, 4484 visits, 网摘, 收藏, 编辑
关于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类型,点击这里下载。
0
0
(请您对文章做出评价)
« 上一篇:开源.NET(C#、VB.NET、J#等)脚本执行引擎(利用CodeDOM)
» 下一篇:最强开源搜索引擎DotLucene1.9+写你自己的超强桌面搜索+索引Office系列文档(PPT/DOC/XLS/OneNote/Project/Visio)+RTF+PFD+XML+各种图片!!!
Add your comment

13 条回复

  1. #1楼 fly_bluewolf2005-06-21 14:05
    我也研究过,记得好像是把每个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. #2楼[楼主] 奋斗中的灵感之源      2005-06-21 14:08
    你的方法不错
      回复  引用  查看    
  3. #3楼 AlleNny      2005-06-21 14:55
    我用NDoc从来没成功过,每次都是以异常而告终。我的代码里都没有中文的。郁闷
      回复  引用  查看    
  4. #4楼 SW515[未注册用户]2005-06-21 17:08
    To 楼主:
      呵呵,送佛送到西吧!

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

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

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

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

    大哥 ,为什么下不到你改的源码,偶的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();
    }
    }

      回复  引用  查看