有一种方法是通过谷歌翻译不使用 翻译文本API v2,即通过通常的WebClient。
该方法接受参数text- 源文本和to- 文本需要翻译成的语言。源文本的语言设置为"auto",即应自动确定。
public static string Translate(string text, string to)
{
var url = $"https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl={to}&dt=t&q={HttpUtility.UrlEncode(text)}";
var webClient = new WebClient { Encoding = Encoding.UTF8 };
var result = webClient.DownloadString(url);
try
{
result = result.Substring(4, result.IndexOf("\"", 4, StringComparison.Ordinal) - 4);
return result;
}
catch (Exception e)
{
Console.WriteLine($"Transalte Error: {e.Message}");
return null;
}
}
问题:
使用几个单词的简单文本,一切正常,但如果您指定多行(带有 content \n)或句子的文本,该方法仅返回第一句的翻译。
原因:
这是因为谷歌翻译\n不是在一行中返回单个句子(或字符串 ( ))的翻译,而是在几行中返回。
例如,当使用此类输入数据调用方法时
string text = @"Нижняя сторона крыльев менее яркая, но более пёстрая. Она коричневато-бурая, с разнообразными красноватыми и белыми пятнами и серыми разводами. Снизу на передних крыльях повторяется рисунок верхней стороны, который дополняется голубыми кольцами в центральной ячейке. Нижняя сторона задних крыльев коричневатая, с замысловатым мраморовидным рисунком, образованным за счет тёмных штрихов и извилистых линий. Также у переднего края заднего крыла находится светлое пятно";
Translate(text, "en");
该方法只会返回第一句
"The underside of the wings is less bright, but more variegated. "
结果将是这样的:
[[["The underside of the wings is less bright, but more variegated. ","Нижняя сторона крыльев менее яркая, но более пёстрая.",null,null,3,null,null,[[]],[[["d79f3353813f458ef00a8442f9b7b2b6","ru_en_2022q1.md"]]]],["It is brownish-brown, with a variety of reddish and white spots and gray stains. ","Она коричневато-бурая, с разнообразными красноватыми и белыми пятнами и серыми разводами.",null,null,3,null,null,[[]],[[["d79f3353813f458ef00a8442f9b7b2b6","ru_en_2022q1.md"]]]],["From below on the forewings, the pattern of the upper side is repeated, which is complemented by blue rings in the central cell. ","Снизу на передних крыльях повторяется рисунок верхней стороны, который дополняется голубыми кольцами в центральной ячейке.",null,null,3,null,null,[[]],[[["d79f3353813f458ef00a8442f9b7b2b6","ru_en_2022q1.md"]]]],["The underside of the hindwings is brownish, with an intricate marble-like pattern formed by dark strokes and sinuous lines. ","Нижняя сторона задних крыльев коричневатая, с замысловатым мраморовидным рисунком, образованным за счет тёмных штрихов и извилистых линий.",null,null,3,null,null,[[]],[[["d79f3353813f458ef00a8442f9b7b2b6","ru_en_2022q1.md"]]]],["There is also a light spot at the anterior edge of the hind wing.","Также у переднего края заднего крыла находится светлое пятно",null,null,3,null,null,[[]],[[["d79f3353813f458ef00a8442f9b7b2b6","ru_en_2022q1.md"]]]]],null,"ru",null,null,null,1,[],[["ru"],null,[1],["ru"]]]
而文本来自一个句子,该方法将正确返回,因为只有一个句子。
解决方案尝试:
\n我尝试用->\\n和\r->替换换行符和回车符\\r,然后在结果文本中返回它们并且它有效,但在我看来这不是正确的解决方案。而且,带点的文本(来自几个句子)仍然作为一个句子返回,这样替换点是不正确的。
在这个对象中,可以像列表一样Python简单地遍历它并获取必要的数据,但是由于强类型,我什至不知道如何反序列化这个对象。forC#
也许还有另一种方式?
感谢
@EvgeniyZ这个解决方案:由于使用来自 的标准方法反序列化来自 Google 翻译的 JSON 响应是有问题的
System.Json.Text,因此解决方案是通过以下方式的转换器Newtonsoft.Json: