Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft Translator API用C翻译整个网页#_C#_Asp.net_Microsoft Translator - Fatal编程技术网

C# 使用Microsoft Translator API用C翻译整个网页#

C# 使用Microsoft Translator API用C翻译整个网页#,c#,asp.net,microsoft-translator,C#,Asp.net,Microsoft Translator,使用C#使用Microsoft Translator API(SOAP)翻译网页。我想让我的网站翻译,但使用翻译小部件对我不好,因为我需要谷歌抓取我翻译的网页以及。因此,在将其发送到浏览器之前,我需要对其进行翻译 到目前为止,还没有API(我试图找到它,我找不到,如果您碰巧知道一个,请提及),您只需传递一个url,它就会向您发送翻译后的响应,如下所示: 以下是我迄今为止所做的尝试: 1.从Url下载字符串,传递到Client.Translate(..) 格式化程序在尝试反序列化 消息:反序列化操

使用C#使用Microsoft Translator API(SOAP)翻译网页。我想让我的网站翻译,但使用翻译小部件对我不好,因为我需要谷歌抓取我翻译的网页以及。因此,在将其发送到浏览器之前,我需要对其进行翻译

到目前为止,还没有API(我试图找到它,我找不到,如果您碰巧知道一个,请提及),您只需传递一个url,它就会向您发送翻译后的响应,如下所示:

以下是我迄今为止所做的尝试: 1.从Url下载字符串,传递到Client.Translate(..)

格式化程序在尝试反序列化 消息:反序列化操作的请求消息正文时出错 “翻译”。已指定最大字符串内容长度配额(30720) 读取XML数据时超出。这一配额可增加10% 更改服务器上的MaxStringContentLength属性 创建XML读取器时使用的XmlDictionaryReaderQuotas对象。 第516行,位置48

二,

这个花了太多时间。最后我得到了一个错误的请求(400)异常

解决这个问题的最好办法是什么?我还计划保存文档,这样就不必每次都进行翻译。

此C#示例从本地文件翻译HTML:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using HtmlAgilityPack;

namespace TranslationAssistant.Business
{
class HTMLTranslationManager
{
    public static int DoTranslation(string htmlfilename, string fromlanguage, string tolanguage)
    {
        string htmldocument = File.ReadAllText(htmlfilename);
        string htmlout = string.Empty;

        HtmlDocument htmlDoc = new HtmlDocument();
        htmlDoc.LoadHtml(htmldocument);
        htmlDoc.DocumentNode.SetAttributeValue("lang", TranslationServices.Core.TranslationServiceFacade.LanguageNameToLanguageCode(tolanguage));
        var title = htmlDoc.DocumentNode.SelectSingleNode("//head//title");
        if (title != null) title.InnerHtml = TranslationServices.Core.TranslationServiceFacade.TranslateString(title.InnerHtml, fromlanguage, tolanguage, "text/html");
        var body = htmlDoc.DocumentNode.SelectSingleNode("//body");
        if (body != null)
        {
            if (body.InnerHtml.Length < 10000)
            {
                body.InnerHtml = TranslationServices.Core.TranslationServiceFacade.TranslateString(body.InnerHtml, fromlanguage, tolanguage, "text/html");
            }
            else
            {
                List<HtmlNode> nodes = new List<HtmlNode>();
                AddNodes(body.FirstChild, ref nodes);

                Parallel.ForEach(nodes, (node) =>
                    {
                        if (node.InnerHtml.Length > 10000)
                        {
                            throw new Exception("Child node with a length of more than 10000 characters encountered.");
                        }
                        node.InnerHtml = TranslationServices.Core.TranslationServiceFacade.TranslateString(node.InnerHtml, fromlanguage, tolanguage, "text/html");
                    });
            }
        }
        htmlDoc.Save(htmlfilename, Encoding.UTF8);
        return 1;
    }

    /// <summary>
    /// Add nodes of size smaller than 10000 characters to the list, and recurse into the bigger ones.
    /// </summary>
    /// <param name="rootnode">The node to start from</param>
    /// <param name="nodes">Reference to the node list</param>
    private static void AddNodes(HtmlNode rootnode, ref List<HtmlNode> nodes)
    {
        string[] DNTList = { "script", "#text", "code", "col", "colgroup", "embed", "em", "#comment", "image", "map", "media", "meta", "source", "xml"};  //DNT - Do Not Translate - these nodes are skipped.
        HtmlNode child = rootnode;
        while (child != rootnode.LastChild)
        {
            if (!DNTList.Contains(child.Name.ToLowerInvariant())) {
                if (child.InnerHtml.Length > 10000)
                {
                    AddNodes(child.FirstChild, ref nodes);
                }
                else
                {
                    if (child.InnerHtml.Trim().Length != 0) nodes.Add(child);
                }
            }
            child = child.NextSibling;
        }
    }

}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.IO;
使用HtmlAgilityPack;
名称空间TranslationAssistant.Business
{
类HTMLTranslationManager
{
公共静态int-DoTranslation(字符串htmlfilename、字符串fromlanguage、字符串tolanguage)
{
字符串htmldocument=File.ReadAllText(htmlfilename);
string htmlout=string.Empty;
HtmlDocument htmlDoc=新HtmlDocument();
htmlDoc.LoadHtml(htmldocument);
htmlDoc.DocumentNode.SetAttributeValue(“lang”,TranslationServices.Core.TranslationServiceFacade.LanguageNameToLanguageCode(tolanguage));
var title=htmlDoc.DocumentNode.SelectSingleNode(//head//title”);
if(title!=null)title.InnerHtml=TranslationServices.Core.TranslationServiceFacade.TranslateString(title.InnerHtml,fromlanguage,tolanguage,“text/html”);
var body=htmlDoc.DocumentNode.SelectSingleNode(“//body”);
if(body!=null)
{
if(body.InnerHtml.Length<10000)
{
body.InnerHtml=TranslationServices.Core.TranslationServiceFacade.TranslateString(body.InnerHtml,fromlanguage,tolanguage,“text/html”);
}
其他的
{
列表节点=新列表();
AddNodes(body.FirstChild,ref节点);
Parallel.ForEach(节点,(节点)=>
{
如果(node.InnerHtml.Length>10000)
{
抛出新异常(“遇到长度超过10000个字符的子节点”);
}
node.InnerHtml=TranslationServices.Core.TranslationServiceFacade.TranslateString(node.InnerHtml,fromlanguage,tolanguage,“text/html”);
});
}
}
保存(htmlfilename,Encoding.UTF8);
返回1;
}
/// 
///将大小小于10000个字符的节点添加到列表中,并递归到较大的节点中。
/// 
///要从中开始的节点
///对节点列表的引用
私有静态void AddNodes(HtmlNode rootnode,ref List节点)
{
string[]DNTList={“script”、“#text”、“code”、“col”、“colgroup”、“embed”、“em”、“comment”、“image”、“map”、“media”、“meta”、“source”、“xml”};//DNT-不翻译-跳过这些节点。
HtmlNode子节点=根节点;
while(child!=rootnode.LastChild)
{
如果(!DNTList.Contains(child.Name.ToLowerInvariant())){
如果(child.InnerHtml.Length>10000)
{
AddNodes(child.FirstChild,ref节点);
}
其他的
{
if(child.InnerHtml.Trim().Length!=0)nodes.Add(child);
}
}
child=child.NextSibling;
}
}
}
}
这是中的HTMLTranslationManager.cs,它使用TranslationServiceFacade.cs中的辅助函数TranslateString()。您可以简化,只需在此处插入translationservice调用来代替TranslateString()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using HtmlAgilityPack;

namespace TranslationAssistant.Business
{
class HTMLTranslationManager
{
    public static int DoTranslation(string htmlfilename, string fromlanguage, string tolanguage)
    {
        string htmldocument = File.ReadAllText(htmlfilename);
        string htmlout = string.Empty;

        HtmlDocument htmlDoc = new HtmlDocument();
        htmlDoc.LoadHtml(htmldocument);
        htmlDoc.DocumentNode.SetAttributeValue("lang", TranslationServices.Core.TranslationServiceFacade.LanguageNameToLanguageCode(tolanguage));
        var title = htmlDoc.DocumentNode.SelectSingleNode("//head//title");
        if (title != null) title.InnerHtml = TranslationServices.Core.TranslationServiceFacade.TranslateString(title.InnerHtml, fromlanguage, tolanguage, "text/html");
        var body = htmlDoc.DocumentNode.SelectSingleNode("//body");
        if (body != null)
        {
            if (body.InnerHtml.Length < 10000)
            {
                body.InnerHtml = TranslationServices.Core.TranslationServiceFacade.TranslateString(body.InnerHtml, fromlanguage, tolanguage, "text/html");
            }
            else
            {
                List<HtmlNode> nodes = new List<HtmlNode>();
                AddNodes(body.FirstChild, ref nodes);

                Parallel.ForEach(nodes, (node) =>
                    {
                        if (node.InnerHtml.Length > 10000)
                        {
                            throw new Exception("Child node with a length of more than 10000 characters encountered.");
                        }
                        node.InnerHtml = TranslationServices.Core.TranslationServiceFacade.TranslateString(node.InnerHtml, fromlanguage, tolanguage, "text/html");
                    });
            }
        }
        htmlDoc.Save(htmlfilename, Encoding.UTF8);
        return 1;
    }

    /// <summary>
    /// Add nodes of size smaller than 10000 characters to the list, and recurse into the bigger ones.
    /// </summary>
    /// <param name="rootnode">The node to start from</param>
    /// <param name="nodes">Reference to the node list</param>
    private static void AddNodes(HtmlNode rootnode, ref List<HtmlNode> nodes)
    {
        string[] DNTList = { "script", "#text", "code", "col", "colgroup", "embed", "em", "#comment", "image", "map", "media", "meta", "source", "xml"};  //DNT - Do Not Translate - these nodes are skipped.
        HtmlNode child = rootnode;
        while (child != rootnode.LastChild)
        {
            if (!DNTList.Contains(child.Name.ToLowerInvariant())) {
                if (child.InnerHtml.Length > 10000)
                {
                    AddNodes(child.FirstChild, ref nodes);
                }
                else
                {
                    if (child.InnerHtml.Trim().Length != 0) nodes.Add(child);
                }
            }
            child = child.NextSibling;
        }
    }

}
}