【问题标题】:How to propertly use Bing Translate API?如何正确使用必应翻译 API?
【发布时间】:2009-11-22 13:10:10
【问题描述】:

我正在使用 Bing 的 API,更准确地说 - 翻译部分,除了一件事 - 自动检测语言之外,它都运行良好。这怎么可能?

我的代码运行良好,以防有人需要查看:

function HTTPEncode(const AStr: string): string;
const
  NoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-'];
var
  i: integer;
begin
  Result := '';

  for i := 1 to Length(AStr) do
  begin
    if CharInSet(AStr[i],NoConversion) then
      Result := Result + AStr[i]
    else
      Result := Result + Format('%%%.2x',[ord(AStr[i])]);
  end;
end;

function GetTranslation(text, fromLang, toLang: string): string;
var
  xmldoc: TXMLDocument;
  inode,mnode,rnode,irnode: IXMLNode;
  j: integer;
  uri: string;
  idhttp:TIdHttp;

begin
  Result := '';

  idhttp:=TIdHttp.Create(nil);
  xmldoc := TXMLDocument.Create(application);
  try
    xmldoc.LoadFromXML(idhttp.Get('http://api.search.live.net/xml.aspx?Appid=' + AppID + '&query='+HTTPEncode(text)+
        '&sources=translation'+
        '&Translation.SourceLanguage=' + fromLang +
        '&Translation.TargetLanguage=' + toLang));
  finally
    idhttp.Free;
  end;

  try
    inode := xmldoc.ChildNodes.FindNode('SearchResponse');

    if Assigned(inode) then
    begin
      uri := 'http://schemas.microsoft.com/LiveSearch/2008/04/XML/translation';
      mnode := inode.ChildNodes.FindNode('Translation',uri);
      if Assigned(mnode) then
      begin
        rnode := mnode.ChildNodes.FindNode('Results',uri);
        if Assigned(rnode) then
        begin
          irnode := rnode.ChildNodes.FindNode('TranslationResult',uri);
          if Assigned(irnode) then
            Result := irnode.ChildNodes.FindNode('TranslatedTerm',uri).NodeValue;
        end;
      end;
    end;
  finally
    xmldoc.Free;
  end;
end;

begin
    ShowMessage(GetTranslation('Hello!','en','de'));
end;

我在使用自动检测功能时跟踪来自http://www.microsofttranslator.com/ 的数据包,结果是'from=;'而如果源语言是英语,它将是 'from=en;'。我也尝试发送 '' 作为源语言,但没有成功 - 没有结果。

如何使用自动检测?

【问题讨论】:

    标签: api bing


    【解决方案1】:

    我使用他们的 Ajax API 做到了这一点。如果您使用空的“from”参数构建查询,则服务会自动检测语言。

    这是我为向服务发出请求而格式化的查询 url:

    @"http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId={0}&from=&to={1}&text={2}"
    

    关键是"from=&to={1}"

    【讨论】:

    • 必应翻译 API 的 AppId 现在已弃用,需要在标头中发送身份验证令牌...所以没有 javascript 喜欢那里,您需要为此使用服务器应用程序。
    • 即使使用"from=&to={1}" 参数它也不起作用(不再起作用?)。 docs 表示它应该仍然可以工作,但我没有看到它。它显然确实检测到语言并正确翻译,但它没有告诉您它检测到的源语言是什么。
    【解决方案2】:

    以下是 API 版本 3 的示例:

    • 没有from参数
    • 英文文本
    • detectedLanguage 导致 en
    • 我读到score 100% 确信这个结果
    $ curl -X POST "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&textType=html&to=fr" \
         -d "[{'Text':'Underbeds'}]">      -H "Ocp-Apim-Subscription-Key:YOUR_KEY_HERE" \
    >      -H "Ocp-Apim-Subscription-Region:global" \
    >      -H "Content-Type: application/json" \
    >      -d "[{'Text':'Underbeds'}]"
    [{"detectedLanguage":{"language":"en","score":1.0},"translations":[{"text":"Sous-lits","to":"fr"}]}]
    

    【讨论】:

    • 这应该是公认的答案,因为将“from”参数排除在外是在翻译时启动自动检测的原因。为了进一步详细说明,您还可以提供一种备用语言,如果自动检测失败,API 将尝试使用该语言。所以我一直在做的是发送我“认为”它将在“suggestedFrom”参数中翻译的语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多