请查看Microsoft的代码以获取翻译数组:
var from = "en";
var to = "es";
var translateArraySourceTexts = textbox.Text.Split(new Char[] { '.' });
var uri = "https://api.microsofttranslator.com/v2/Http.svc/TranslateArray";
var body = "<TranslateArrayRequest>" +
"<AppId />" +
"<From>{0}</From>" +
"<Options>" +
" <Category xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
"<ContentType xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\">{1}</ContentType>" +
"<ReservedFlags xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
"<State xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
"<Uri xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
"<User xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />" +
"</Options>" +
"<Texts>" +
** "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{2}</string>" +
** "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{3}</string>" +
** "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{4}</string>" +
"</Texts>" +
"<To>{5}</To>" +
"</TranslateArrayRequest>";
** string requestBody = string.Format(body, from, "text/plain", translateArraySourceTexts[0], translateArraySourceTexts[1], translateArraySourceTexts[2], to);
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
request.Content = new StringContent(requestBody, Encoding.UTF8, "text/xml");
request.Headers.Add("Authorization", authToken);
var response = await client.SendAsync(request);
var responseBody = await response.Content.ReadAsStringAsync();
switch (response.StatusCode)
{
case HttpStatusCode.OK:
Console.WriteLine("Request status is OK. Result of translate array method is:");
var doc = XDocument.Parse(responseBody);
var ns = XNamespace.Get("http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2");
var sourceTextCounter = 0;
foreach (XElement xe in doc.Descendants(ns + "TranslateArrayResponse"))
{
foreach (var node in xe.Elements(ns + "TranslatedText"))
{
Console.WriteLine("\n\nSource text: {0}\nTranslated Text: {1}", translateArraySourceTexts[sourceTextCounter], node.Value);
}
sourceTextCounter++;
}
break;
default:
Console.WriteLine("Request status code is: {0}.", response.StatusCode);
Console.WriteLine("Request error message: {0}.", responseBody);
break;
}
}
}
请关注**线。我想翻译输入框中的句子,并使用“。”作为每个句子的指标。
我的问题是,在带有**的行代码中,目前只能检测到3个句子。如果我输入超过3个句子,则不会检测到第四个句子和其余句子。如果输入少于3个句子,则会出现错误System.IndexOutOfRangeException: 'Index was outside the bounds of the array.
我的问题是,如果系统检测到更多句子并自动调整数组,如何让系统自动附加数组?请给我一些建议
答案 0 :(得分:0)
在你的html字符串中,变量的空格定义为{0},{1},{2},{3},{4},{5}。
您突出显示的行是
string.Format(body, from, "text/plain", translateArraySourceTexts[0], translateArraySourceTexts[1], translateArraySourceTexts[2], to);
正在用&#34; from
&#34; 取代{0} <{>} text/plain
,{1},{ 2} translateArraySourceTexts[0]
,{3} translateArraySourceTexts[1]
,{4} translateArraySourceTexts[2]
, {5}按此顺序 to
。
由于您只使用文本句子的索引[0], [1] and [2]
,因此您只能在文档正文中附加3个句子。
如何解决?
您可以在文本框中输入更多句子。拆分时,translateArraySourceTexts将包含更多项目。在正文HTML字符串中添加更多索引以获得更多句子(如{6},{7}),然后将您的句子传递给string.Format中的body作为translateArraySourceTexts [3],translateArraySourceTexts [4]。它会工作。它将改变为下面提到的内容。
string.Format(body, from, "text/plain", translateArraySourceTexts[0], translateArraySourceTexts[1], translateArraySourceTexts[2], translateArraySourceTexts[3], translateArraySourceTexts[4], to);
有关string.Format
的更多信息http://blog.stevex.net/string-formatting-in-csharp/
https://channel9.msdn.com/Forums/TechOff/Help-with-C-Method-with-a-string-and-Multiple-Parameters
修改强> 既然你提到你可以输入很多句子。你已经拆分了这些句子并获得了一个数组长度,例如x。我们只需将这一系列句子称为句子。创建一个大小为x + 3的对象数组。因此,如果输入4个句子,则创建一个7的对象数组。
object[] dataArr = new object[x+3]
您已经在 <string tags>
xml节点中创建了 <Texts>
字符串。 您需要输入与句子一样多的字符串。在这种情况下,您需要在<string tags>
部分中添加4个<Texts>
字符串,每个字符串都会增加占位符,例如{2},{3},{4}等等。
现在,填充此dataArr。
dataArr[0] = from;
dataArr[1] = "text/plain";
dataArr[dataArr.Length - 1] = to;
for(var i=2; i < dataArr.Length - 1; i++)
{
dataArr[i] = sentences[i-2];
}
并将 dataArr 传递给 string.Format
string.Format(body,dataArr)
答案 1 :(得分:0)
如果您正在使用C#6,字符串插值和LINQ将起作用。 String.Format()限制您可以在此处执行的操作。
字符串插值(一行字符串前面带有 $ 或 $ @ 多行)让您只需将变量表达式用 {} 包围,就可以直接将数据插入到字符串中...... 可以让您更轻松地执行此类操作... 强>
var contentType = "text/plain";
var body = $@"<TranslateArrayRequest>
<AppId />
<From>{from}</From>
<Options>
<Category xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
<ContentType xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\">{contentType}</ContentType>
<ReservedFlags xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
<State xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
<Uri xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
<User xmlns=\"http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2\" />
</Options>
<Texts>{String.Join("\r",translatedArraySourceTexts.Select(s=>$"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{s}</string>"))}</Texts>
<To>{to}</To>
</TranslateArrayRequest>";
以下是它的工作原理:
{String.Join("\r",translatedArraySourceTexts.Select(s=>$"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">{s}</string>"))}
从内部开始:它使用LINQ to Select()每个句子并使用嵌套字符串插值($"<string... {s}</string>")
将插入标记,然后< strong> String.Join()将结果组合成一个由回车分隔的字符串。
同样,这仅适用于C#6.0
您可以在字符串插值here上找到更多信息。