Ir al contenido


Foto

Traductores automáticos


  • Por favor identifícate para responder
8 respuestas en este tema

#1 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 02 abril 2014 - 11:30

Hola amigos.

Llevo un par de días atascado con el Traductor Automático de Microsoft, y me gustaría compartirlo con vosotros a ver si alguien ve el problema que me encuentro.

En una aplicación quiero poder traducir automáticamente textos entre Castellano, Inglés y Francés. En un principio pensé en utilizar el Google Translator, pero Google te cobra desde la primera traducción, así que me he decidido por el Bing Translator de Microsoft, que solo te cobra a partir de más de 2 millones de traducciones al mes (y yo solo pienso llegar a unos pocos centenares).

En principio parece tremendamente sencillo de utilizar como WebService.

1) De esta dirección me bajo el archivo WDSL que define el Servicio : http://api.microsoft...2/soap.svc?wsdl

2) En una aplicación nueva, voy a Components -> Import WDSL, e importo ese archivo (cosa que añade una nueva Unit al programa).

3) Ya solo tengo que añadir esa nueva Unit al Uses del formulario, y ejecutar este código :



delphi
  1. const AppID = '71rBoF0cOf***************';
  2.  
  3. ShowMessage(GetLanguageService(True, '', nil).Translate(AppID, 'Hello World', 'en', 'es', 'text/plain', 'general'));



El caso es que la llamada se ejecuta perfectamente, y el Servidor de Microsoft responde. Pero en lugar de devolverme la traducción de "Hello World", me indica que mi AppID no es válida.

Me he creado una cuenta http://datamarket.azure.com/

Imagen Enviada

Me he suscrito al Microsoft Translator.

[img width=722 height=600]http://www.idata.com.es/tmp/WebService2.jpg[/img]

Y he registrado una aplicación propia.

[img width=800 height=528]http://www.idata.com.es/tmp/WebService3.jpg[/img]

He probado usando los tres códigos como AppID (Clave de Cuenta, ID de Cliente y ID de programa) pero ninguno me lo reconoce como válido (sé que es el servidor quien responde, porque si pongo como parámetro un código de lenguaje inexistente, el servicio me devuelve el error de lenguaje no válido, cosa que solo la puede identificar el servidor).

¿ Alguién ha utilizado la API de Servicios Web de Microsoft y sabe que código tengo que usar para acceder a ese servicio ?.

Gracias.
  • 0

#2 luisgutierrezb

luisgutierrezb

    Advanced Member

  • Miembros
  • PipPipPip
  • 92 mensajes
  • LocationMéxico

Escrito 02 abril 2014 - 02:38

de la ayuda de microsoft, no se si te sirva:

appId
Required. If the Authorization header is used, leave the appid field empty else specify a string containing "Bearer" + " " + access token.

lo saque de:

http://msdn.microsof...y/ff512437.aspx

No eh usado el servicio de traducción, así que no puedo ayudar mucho, espero te sirva
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 03 abril 2014 - 04:31

Gracias por el interés.

Si añado esa cadena al principio del identificador, entonces el error que salta es otro: The Web Token must have a signature at the end. The incoming token did not have a signature at the end of the token. :ID=3925.V2_Soap.Translate.51C02A16.
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 03 abril 2014 - 04:40

Por ahora voy a utilizar el servicio mediante HTTP en lugar de WebService, tal y como se define en este artículo (hay que ir a los comentarios, puesto que el artículo describe el servicio antiguo, ya dado de baja). http://theroadtodelp...v2-from-delphi/

Pero si alguien puede usar el WebService, le agradecería que me indicara que es lo que estaba haciendo mal. Puesto que preferiría usar el WebService, mediante HTTP no me respeta los saltos de línea (ya que toda la cadena a traducir se debe poner en una URL), así como tampoco puedo traducir texto enriquecido (texto con formato en HTML).

Si lo queréis usar solo tenéis que añadir esta Unit a vuestros proyectos :



delphi
  1. unit Traductor;
  2.  
  3. interface
  4.  
  5.   function Traduccion(const AText, SourceLng, DestLng: string): string;
  6.  
  7. implementation
  8.  
  9. uses SysUtils, MSXML, IdURI, IdHTTP, IdSSLOpenSSL;
  10.  
  11. const ApplicationId = '71rBoF0cOfKzV4jv29*********************';  // Aquí hay que usar vuestra cuenta en http://datamarket.azure.com
  12.  
  13. function Traduccion(const AText, SourceLng, DestLng: string): string;
  14. const
  15.   MicrosoftTranslatorTranslateUri = 'http://api.datamarket.azure.com/Bing/MicrosoftTranslator/v1/Translate?appId=%s&Text=%s&From=%s&To=%s';
  16.   Msxml2_DOMDocument = 'Msxml2.DOMDocument.6.0';
  17. var
  18.   LIdHTTP: TIdHTTP;
  19.   LIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  20.   LIndex: integer;
  21.   URI, Response: string;
  22.   XMLDOMDocument  : IXMLDOMDocument;
  23.   XMLDOMNode      : IXMLDOMNode;
  24.   XMLDOMNodeList  : IXMLDOMNodeList;
  25.   cXMLDOMNode    : IXMLDOMNode;
  26. begin
  27.   LIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  28.   try
  29.     LIOHandler.SSLOptions.Method := sslvTLSv1;
  30.     LIOHandler.SSLOptions.Mode := sslmUnassigned;
  31.     LIOHandler.SSLOptions.VerifyMode := [];
  32.     LIOHandler.SSLOptions.VerifyDepth := 0;
  33.     LIOHandler.Host := '';
  34.  
  35.     LIdHTTP := TIdHTTP.Create(nil);
  36.     try
  37.       LIdHTTP.Request.ContentEncoding := 'utf-8';
  38.       LIdHTTP.Request.BasicAuthentication := true;
  39.       LIdHTTP.Request.UserName := ApplicationID;
  40.       LIdHTTP.Request.Password := ApplicationID;
  41.       LIdHTTP.IOHandler := LIOHandler;
  42.       URI := Format(MicrosoftTranslatorTranslateUri, ['%27'+TIdURI.PathEncode(AText)+'%27', '%27'+DestLng+'%27', '%27'+SourceLng+'%27']);
  43.       Response := LIdHTTP.Get(URI);
  44.       XMLDOMDocument:=CoDOMDocument.Create;
  45.       try
  46.         XMLDOMDocument.loadXML(Response);
  47.  
  48.         if (XMLDOMDocument.parseError.ErrorCode<>0) then
  49.           raise Exception.CreateFmt('Error in Xml Data %s', [XMLDOMDocument.parseError]);
  50.         XMLDOMNode := XMLDOMDocument.selectSingleNode('/feed');
  51.         XMLDOMNodeList := XMLDOMNode.selectNodes('//entry');
  52.  
  53.         if XMLDOMNodeList<>nil then
  54.         for LIndex:=0 to  XMLDOMNodeList.length-1 do
  55.         begin
  56.           cXMLDOMNode:=XMLDOMNode.selectSingleNode(Format('//entry[%d]/content/m:properties/d:Text',[LIndex]));
  57.           Result:=String(cXMLDOMNode.Text);
  58.           Break;
  59.         end;
  60.  
  61.       finally
  62.         XMLDOMDocument:=nil;
  63.       end;
  64.     finally
  65.       LIdHTTP.Free;
  66.     end;
  67.   finally
  68.     LIOHandler.Free;
  69.   end;
  70. end;
  71.  
  72. end.



Ejemplo de usar la traducción en un formulario cualquiera :



delphi
  1. ...
  2. uses Traductor;
  3. ...
  4.  
  5. ...
  6. ...
  7. ShowMessage(Traduccion('Hola Mundo', 'es', 'en'));
  8. ...



Recordad que tenéis que crearos una cuenta en http://datamarket.azure.com/

Imagen Enviada

Y suscribiros al Microsoft Translator. http://datamarket.az...osofttranslator (hay una suscripción gratuita de hasta 2 millones de traducciones al mes).

[img width=722 height=600]http://www.idata.com.es/tmp/WebService2.jpg[/img]

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 03 abril 2014 - 11:11

Ya he obtenido mis ID's y tampoco he podido consumir el webService, me regresa el mismo error que a ti, ya veré que es lo que se requiere

Saludos
  • 0

#6 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 03 abril 2014 - 11:34

Ya he obtenido mis ID's y tampoco he podido consumir el webService, me regresa el mismo error que a ti, ya veré que es lo que se requiere

Saludos


Si lo descubres te lo agradecería. Por HTTP funciona bien, pero el texto que le puedes pasar es más limitado (sin saltos de línea, formato, ...).

Esta mañana dejé una consulta en los Foros de Microsoft, pero no parece que tengan mucha actividad.

http://social.msdn.m...osofttranslator
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 04 abril 2014 - 02:47

Marc, parece ser que una vez registra la aplicacion y esas cosas, y antes de conectar con el webservice, has de conseguir el token con una llamada por http: a un servidor de tokens que te devuelve la informacion en json, y luego usas ese token en la conexion del webservide:

http://msdn.microsof...y/hh454950.aspx

Aqui otro ejemplo:

http://weblog.west-w...ine-Translation

Espero que vaya encaminado!
  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 04 abril 2014 - 04:17

Hola Sergio, gracias por buscar esta información.

Marc, parece ser que una vez registra la aplicacion y esas cosas, y antes de conectar con el webservice, has de conseguir el token con una llamada por http: a un servidor de tokens que te devuelve la informacion en json, y luego usas ese token en la conexion del webservide:

http://msdn.microsof...y/hh454950.aspx

Aqui otro ejemplo:

http://weblog.west-w...ine-Translation

Espero que vaya encaminado!


Fíjate que estos ejemplos son usando el protocolo HTTP y no un WebService. Pero ya he utilizado el traductor con protocolo HTTP y funciona bien (el código que he puesto en el segundo mensaje), sin necesidad de crear un token de seguridad.

Y es que por lo que he leído el token de seguridad se crea para cuando no quieres que se transmita arriba y abajo tu cuenta Bing. Para ello consigues un token temporal y lo utilizas en su lugar, pero la verdad es que a mi no me importa lo más mínimo que me pueden interceptar mi código de cuenta (la he creado solo para esto).

Un placer saludarte de nuevo  :)
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 04 abril 2014 - 04:39

Marc, parece ser que una vez registra la aplicacion y esas cosas, y antes de conectar con el webservice, has de conseguir el token con una llamada por http: a un servidor de tokens que te devuelve la informacion en json, y luego usas ese token en la conexion del webservide:

http://msdn.microsof...y/hh454950.aspx

Aqui otro ejemplo:

http://weblog.west-w...ine-Translation

Espero que vaya encaminado!


En efecto, hay varios servicios web que solicitan un token antes de generar la llamada al método principal y ya había pensado que ese era el problema, pero ya hice la prueba y tampoco puedes obtener el token, muestra el mismo error de AppID no válido

Saludos
  • 0




IP.Board spam blocked by CleanTalk.