当前位置: 首页 > 面试题库 >

Google翻译V2无法处理来自C#的大文本翻译

马庆
2023-03-14
问题内容

我已经使用带有GET方法的Google Translation V2
API实现了C#代码。它成功地翻译了小文本,但是当增加文本长度并且它需要1800个字符长(包括URI参数)时,出现“ URI太大”错误。

好的,我烧掉了所有路径,并在Internet上发布的多个页面上调查了该问题。他们所有人都明确指出,应该重写GET方法以模拟POST方法(该方法旨在为5,000个字符URI提供支持),但是无法找到该方法的代码示例。

有没有人有任何例子或可以提供一些信息?

[ 编辑 ]这是我正在使用的代码:

String apiUrl = "https://www.googleapis.com/language/translate/v2?key={0}&source={1}&target={2}&q={3}";
            String url = String.Format(apiUrl, Constants.apiKey, sourceLanguage, targetLanguage, text);
            Stream outputStream = null;

        byte[] bytes = Encoding.ASCII.GetBytes(url);

        // create the http web request
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.KeepAlive = true;
        webRequest.Method = "POST";
        // Overrride the GET method as documented on Google's docu.
        webRequest.Headers.Add("X-HTTP-Method-Override: GET");
        webRequest.ContentType = "application/x-www-form-urlencoded";

        // send POST
        try
        {
            webRequest.ContentLength = bytes.Length;
            outputStream = webRequest.GetRequestStream();
            outputStream.Write(bytes, 0, bytes.Length);
            outputStream.Close();
        }
        catch (HttpException e)
        {
            /*...*/
        }

        try
        {
            // get the response
            HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
            if (webResponse.StatusCode == HttpStatusCode.OK && webRequest != null)
            {
                // read response stream 
                using (StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                {
                    string lista = sr.ReadToEnd();

                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TranslationRootObject));
                    MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(lista));
                    TranslationRootObject tRootObject = (TranslationRootObject)serializer.ReadObject(stream);
                    string previousTranslation = string.Empty;

                    //deserialize
                    for (int i = 0; i < tRootObject.Data.Detections.Count; i++)
                    {
                        string translatedText = tRootObject.Data.Detections[i].TranslatedText.ToString();
                        if (i == 0)
                        {
                            text = translatedText;
                        }
                        else
                        {
                            if (!text.Contains(translatedText))
                            {
                                text = text + " " + translatedText;
                            }
                        }
                    }
                    return text;
                }
            }
        }
        catch (HttpException e)
        {
            /*...*/
        }

        return text;
    }

问题答案:

根据文档WebClient,显然无法使用标题,因为您无法根据需要更改标题:

注意:如果要在单个请求中发送更多数据,也可以使用POST调用API。qPOST正文中的参数必须少于5K个字符。要使用POST,您必须使用X-HTTP- Method-Override标头来告诉Translate API将请求视为GET(使用X-HTTP-Method-Override: GET)。

您可以使用WebRequest,但需要添加X-HTTP-Method-Override标题:

var request = WebRequest.Create (uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("X-HTTP-Method-Override", "GET");

var body = new StringBuilder();
body.Append("key=SECRET");
body.AppendFormat("&source={0}", HttpUtility.UrlEncode(source));
body.AppendFormat("&target={0}", HttpUtility.UrlEncode(target));
 //--
body.AppendFormat("&q={0}", HttpUtility.UrlEncode(text));

var bytes = Encoding.ASCII.GetBytes(body.ToString());
if (bytes.Length > 5120) throw new ArgumentOutOfRangeException("text");

request.ContentLength = bytes.Length;
using (var output = request.GetRequestStream())
{
    output.Write(bytes, 0, bytes.Length);
}


 类似资料:
  • 我正在使用 我得到以下错误,我不明白我做错了什么

  • C++98有一套用于模板类型推导的规则,C++11 修改了其中的一些规则并为auto和decltype添加了新的规则。

  • 我知道这是一个简单的问题但我不知道如何解决它。 从现在起,我已经有我的应用程序以西班牙语出版,但我想把它翻译成英语。所以我翻译了string resources文件,并导出了两次apk,一次是西班牙语的,另一次是英语的。我不知道如何发布两个apk,也不知道我需要做什么来翻译这个APP...我没有找到关于如何在不支付官方翻译服务的情况下做到这一点的信息。 多谢帮忙!

  • 疑惑:同一个单词不同位置,上面那个点击不会出现翻译,下面就可以。 问:这是什么情况,可以修复吗?

  • 翻译 & 本地化 Docusaurus允许使用 Crowdin 轻松实现翻译功能。 以英文撰写的文档文件将上传到 Crowdin,由社区内的用户进行翻译。 使用英文字符串编写的顶层页面可以通过在 <translate> 标签中包装要翻译的任何字符串来翻译。 其他标题和标签也将被找到并正确翻译。 Docusaurus 翻译配置 要用 Docusaurus 生成用于翻译的示例文件,请使用命令行参数 t

  • 您可使用 Google Translate™ 应用程式翻译词组: 按下侧边电源按钮打开应用程式菜单,找到并轻触Translate(翻译)。 您将看到翻译源语言与目标语言这两种语言。您可通过轻触某一语言的名称来更改语言。 轻触“麦克风”图标并说出您想翻译的词组。 译文将显示在屏幕上。