Arquitectura, buenas prácticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016

[SharePoint 2013] Servicio de Traducción

Servicio de traducción automaticoUna de las grandes novedades que trae esta nueva versión de SharePoint es la incorporación de un servicio de traducción que proporciona la capacidad de traducir automáticamente archivos, páginas y sitios. Este es un requerimiento que en versiones anteriores era muy importante para los portales web multiidoma de hay que desde Encamina desarrollaramos una producto llamado Tramat que su funcionamiento era utilizar un servicio alojado en Azure y ofrece la traducción oficial a varios idiomas de los contenidos de un portal web o Intranet basada en SharePoint, de manera totalmente automática e integrada con el CMS. Todo esto que nosotros consideramos que era un requerimiento básico para mucho de nuestros clientes ya esta incluida dentro de las características base de esta nueva versión 2013.

Ahora bien como podemos hacer uso de esta opción, pues tenemos dos opciones bien activamos el servicio desde la Administración Central o bien lo activamos usando PowerShell a través de estos comandos:

$tj = get-sptimerjob "Sharepoint Translation Services"
$tj.Runnow()

Arquitectura Servicio de TraducciónEl servicio de traducción soporta tres tipos de traducciones: sincrona, asíncrona y streaming. En el caso de las traducciones asíncronas, el proceso es realizado por un TimerJob cuya frecuencia de ejecución se configura desde la Administración central (aunque por defecto se ejecuta cada 15 minutos). Por lo general utilizaremos una llamada asíncrona (mediante un TimerJob de SharePoint) que lo que hace es consultar bien en Bing o en algún servicio especifico que nosotros configuremos y le enviamos el texto a traducir e inmediatamente nos devuelve la traducción. Un caso básico en el que lo vamos a utilizar es un sitio de publicación con varios idiomas, queremos traducir el contenido de la variante principal (en nuestro caso español) y queremos traducirla al ingles.

Ahora bien Microsoft no se ha conformado solo con solucionar esta problemática sino que al igual que en casi todas las opciones, nos ha proporcionado una serie de modelo de Objetos para poder acceder tanto desde el modelo de objetos en el servidor como en el cliente e incluso cuenta con una API Rest para realizar estas operaciones. A continuación explicaremos los tres casos.

Modelo de Objetos en Servidor
Para hacer uso de este modelo en nuestros desarrollos tendremos que añadir la siguientes referencia: Microsoft.Office.TranslationServices.dll

Una vez esto con poner el siguiente código iniciaríamos la traducción asíncrona:

SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
TranslationJob job = new TranslationJob(sc, CultureInfo.GetCultureInfo(culture));
using (SPSite siteIn = new SPSite(inputList))
{
    using (SPWeb webIn = siteIn.OpenWeb())
    {
        using (SPSite siteOut = new SPSite(outputList))
        {
            using (SPWeb webOut = siteOut.OpenWeb())
            {
                SPDocumentLibrary listIn = (SPDocumentLibrary)webIn.GetList(inputList);
                SPDocumentLibrary listOut = (SPDocumentLibrary)webOut.GetList(outputList);
                job.AddLibrary(listIn, listOut);
                job.Start();
            }
        }
    }
}

Como hemos observado hemos realizado una llamada asíncrona, y en caso de que deseemos podemos monitorizar el proceso de traducción para saber si la traducción se ha realizado con éxito o no para ello tenemos que hacer uso de la clase Translation.JobStatus y jugar con las funciones que viene de serie.

En caso de que queramos realizar llamadas sincronas (por el tema de las requerimientos tendremos que realizarlo de la siguiente forma:

SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
SyncTranslator job = new SyncTranslator(sc, CultureInfo.GetCultureInfo(jobCulture));
TranslationItemInfo itemInfo = job.Translate(input, output);

Modelo de Objetos en Cliente
SharePoint dispone de una implementación del modelo de objetos en cliente en 4 variantes: .Net, JavaScript, Silverligth y WindowsPhone. En estas APIs están implementadas la mayoría de la funcionalidad de traducción disponible en la API del servidor. La única pega es que en las llamadas sincronas solo se soportan traducción de archivos.
Para hacerlo en .NET tenemos que añadir las librerías clientes tanto de SharePoint como del servicio de traducción: Microsoft.SharePoint.Client.dll y Microsoft.Office.TranslationServices.Client.

Para traducir un fichero de forma asincrona bastaría con poner el siguiente código:

ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
string culture  = "cultureID";
string name = "translationJobName";
string  inputFile =  "http://serverName/path/inputFileName";
string outputFile = "http://serverName/path/outputFileName";
TranslationJob job = new TranslationJob(clientContext , culture);
job.AddFile(inputFile , outputFile);
job.Name = name;
job.Start();
clientContext.Load(job);
clientContext.ExecuteQuery();
//To retrieve the translation job ID.
string jobID = job.JobId;

Para realizar una llamada sincrona tenemos que llamar a la clase SyncTranslator (de la misma forma que sucede en el modelo de objetos en Servidor):

ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
string culture = "cultureID"
string inputFile = "http://serverName/path/inputFileName";
string outputFile = "http://serverName/path/outputFileName";
SyncTranslator job = new SyncTranslator(clientContext , culture);
job.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite;
ClientResult cr = job.Translate(inputFile, outputFile );
clientContext.ExecuteQuery();
//To retrieve additional information about the translation job.
string errorCode = clientContext.Value.ErrorCode;
string errorMessage = clientContext.Value.ErrorMessage;
string translateID = clientContext.Value.TranslationId;
string succeedResult  = clientContext.Value.Succeeded;
string failResult  = clientContext.Value.Failed;
string cancelStatus = clientContext.Value.Canceled;
string inProgressStatus = clientContext.Value.InProgress;
string notStartedStatus = clientContext.Value.NotStarted;

Para realizarlo haciendo uso de JavaScript la sintaxis es muy semejante y para un fichero asíncrono tenemos que realizar lo siguiente:

var asyncJob;
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
asyncJob = SP.Translation.TranslationJob.newObject(clientContext, "cultureID");
asyncJob.set_outputSaveBehavior(SP.Translation.SaveBehavior.alwaysOverwrite);
asyncJob.addFile("inputFilePath", "outputFilePath");
asyncJob.set_name("translationJobName");
asyncJob.start();
clientContext.load(asyncJob);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededASync),Function.createDelegate(this, this.onQueryFailed));

Para realizarlo una llamada síncrona lo podemos realizar de la siguiente forma:

var result;
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
var job = SP.Translation.SyncTranslator.newObject(clientContext, "cultureID");
job.set_outputSaveBehavior(SP.Translation.SaveBehavior.alwaysOverwrite);
result = job.translate("inputFilePath", "outputFilePath");
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededSync),
Function.createDelegate(this, this.onQueryFailed));

API Rest
Naturalmente la API Rest no podía faltar y casi el 99% de los objetos de SharePoint tienen su correspondiente punto de entrada, con la API Rest se puede realizar las mismas acciones que con los modelos de objetos en servidor y cliente.
Traducción asincrona
Para realizar la traducción de asíncrono:
http://serverName/_api/TranslationJob(‘language’)
Traducir un fichero Asincronamente:
http://serverName/_api/TranslationJob(‘language’)/TranslateFile(inputFile=’/path/intput file’, outputFile=’/path/output file’)
Traducir una carpeta Asíncronamente
http://serverName/_api/TranslationJob(‘language’)/TranslateFolder(inputFolder=’/path/in’, outputFolder=’/path/out’)
Traduri una Lista asíncronamente
http://serverName/_api/TranslationJob(‘language’)/TranslateLibrary(inputLibrary=’/LibraryName’, outputLibrary=’/LibraryName»)
Para realizar la traducción de síncrono:
http://serverName/_api/SyncTranslator(‘language’)/Translate(outputFile=’/path/output file’, inputFile=’/path/input file’)

Conclusión

Como hemos visto este servicio de traducción es una gran mejora y que viene a solucionar un problema que se arrastraba desde versiones anteriores donde todo esto se transformaba en una problemática y que muchos clientes no valoraban en su justa medida (si Google lo tiene y gratuito como que un producto como SharePoint no tiene?, y no te quedaba decir que no se puede ser un 10 en todo 🙂 )
Además otro punto bastante interesante es su uso dentro de la Suite de Office y en la que tendremos nuestro documento Word que lo tenemos que traducir a varios idiomas y con dos clics lo tendremos traducido. Abajo pongo varios ejemplos y uno de ellos es una APP de Word para traducir el texto.
Ahora bien no pensemos que este traductor es 100 % seguro como todo traductor contiene sus fallos y conviene revisarlo pero si que ahorra muchísimo trabajo.

Si queréis jugar con el servicio de traducción podeis descargaros estos ejemplos:
http://code.msdn.microsoft.com/office/SharePoint-2013-Access-cdaff6b2/view/SourceCode#content
http://code.msdn.microsoft.com/office/SharePoint-2013-Accessing-647f6dd9
http://code.msdn.microsoft.com/office/SharePoint-2013-Implement-7b48ae36
http://code.msdn.microsoft.com/office/SharePoint-2013-Perform-a-8e53b06a

Si queréis mas información
http://msdn.microsoft.com/en-us/library/jj163145(v=office.15).aspx#TranslationSvc_UsingCSOM

mm

Sobre Adrián Díaz

Adrián Díaz es Ingeniero Informático por la Universidad Politécnica de Valencia. Es MVP de Microsoft en la categoría Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnologías Microsoft más de 10 años y desde hace 3 años está centrado en el desarrollo sobre SharePoint. Actualmente es Software & Cloud Architect Lead en ENCAMINA.
Esta entrada ha sido publicada en sharepoint 2013 y etiquetada como , , , . Enlace permanente .
Suscríbete a Desarrollando sobre SharePoint

Suscríbete a Desarrollando sobre SharePoint

Recibe todas las actualizaciones semanalmente de nuestro blog

You have Successfully Subscribed!

ENCAMINA, piensa en colores