我正在尝试使用 Microsoft Translator API 将中文(简体)翻译成英文。
几个要求
我必须使用 HTTP 方法
POST
,而不是GET
使用查询字符串,因为我的查询超过了 Microsoft 的 URI 限制 15,845 个字符(请注意,即使我使用的中文字符少于 10,000 个字符限制,这也是可能的。原因是查询字符串必须进行 URL 编码,这会大大增加长度,但在确定字符数之前,它会被 Microsoft 解码。唯一允许 s 的翻译 HTTP 方法
POST
是TranslateArrayMethod
,例如,TranslateMethod
唯一允许GET
s。不幸的是,TranslateArrayMethod
它只接受一个 XML 文档,所以我必须使用 XML。
以下是我发送的 XML 文档的示例:
<TranslateArrayRequest>
<AppId/>
<From>es</From>
<Options>
<ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>
</Options>
<Texts>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<![CDATA[Hola]]>
</string>
</Texts>
<To>en</To>
</TranslateArrayRequest>
这工作正常,结果是:
<ArrayOfTranslateArrayResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<TranslateArrayResponse>
<From>es</From>
<OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:int>4</a:int>
</OriginalTextSentenceLengths>
<TranslatedText>Hello</TranslatedText>
<TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:int>5</a:int>
</TranslatedTextSentenceLengths>
</TranslateArrayResponse>
</ArrayOfTranslateArrayResponse>
但是,如果我再添加任何中文字符,如下所示:
<TranslateArrayRequest>
<AppId/>
<From>zh-CHS</From>
<Options>
<ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>
</Options>
<Texts>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<![CDATA[南]]>
</string>
</Texts>
<To>en</To>
</TranslateArrayRequest>
我得到一个奇怪的回应:
<html>
<body/>
<h1>System.Runtime.Serialization.SerializationException</h1>
<p>Message: There was an error deserializing the object of type Microsoft.MT.MDistributor.V2.TranslateArrayRequest. Unexpected end of file. Following elements are not closed: TranslateArrayRequest. Line 1, position 298.</p>
</html>
请注意,我也尝试不使用 CDATA 转义,但这没有帮助。改变From
语言也没有效果。
我正在使用 Node.js (Javascript),尽管因为这是一个通用的 HTTP API,我认为这并不重要。