Integrar servicio de traducción de Bing con Silverlight

Voy a mostrar como podemos utilizar la API de Bing, para integrar un servicio de traducción dentro de nuestra aplicación Silverlight.

Para empezar debemos obtener un AppID que nos va a permitir utilizar las API de Bing, para ello debemos ir aquí, autenticarnos con nuestro Live ID y obtener el AppID.

Para acceder a estos servicios tenemos tres maneras

  • Interfaz Ajax
  • HTTP
  • SOAP

Para nuestro ejemplo vamos a utilizar SOAP para consumir los servicios.

Primero creamos desde Visual Studio, una aplicación Silverlight.

Segundo agregamos la referencia al servicio, la url para acceder vía SOAP es http://api.microsofttranslator.com/V1/SOAP.svc.

1 

Vamos a crear entonces los controles necesarios en nuestro XAML.

<StackPanel HorizontalAlignment="Center">
 
    <TextBlock>Idioma Origen</TextBlock>
    <ComboBox x:Name="comboOrigen" 
              Width="250"></ComboBox>
    
    <TextBlock>Texto Origen</TextBlock>
    <TextBox x:Name="textoOrigen" 
             Height="56" Width="250" FontSize="34"/>
 
    <TextBlock>Idioma Destino</TextBlock>
    <ComboBox x:Name="comboDestino" 
              Width="250"></ComboBox>
 
    <TextBlock>Texto Destino</TextBlock>
    <TextBox x:Name="textoDestino" 
             Height="56" Width="250" FontSize="34"/>
    
    <Button x:Name="botonTraducir" 
            Click="botonTraducir_Click" 
            Content="Traducir" Width="50"/>
 
</StackPanel>

Tenemos un ComboBox para elegir los idiomas y un TextBox para el ingresar el texto que quiero traducir y para mostrar el resultado. Un Button para disparar la traducción.

Agregamos las referencias a las librerías que vamos a necesitar.

using BingTranslator.TranslatorService;
using System.Collections.ObjectModel;

Crear algunas variables que vamos a utilizar.

// Referencia SOAP a Bing Translator
TranslatorService.LanguageServiceClient 
    ls = new LanguageServiceClient();
// AppId para utilizar los servicios de Bing
string AppId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
// Collecion de Idiomas
ObservableCollection<string> langcodes;

 

Cómo los métodos que utiliza el servicio son asincrónicos, necesitamos generar los handlers necesarios. Esto lo vamos a realizar desde Load de nuestra aplicación.

 

// Handlers
ls.TranslateCompleted +=
    new EventHandler<TranslateCompletedEventArgs>
        (ls_TranslateCompleted);
ls.GetLanguageNamesCompleted += 
    new EventHandler<GetLanguageNamesCompletedEventArgs>
        (ls_GetLanguageNamesCompleted);
ls.GetLanguagesCompleted += 
    new EventHandler<GetLanguagesCompletedEventArgs>
        (ls_GetLanguagesCompleted);

Vamos a llenar los combos de los idiomas y a guardar en nuestra colección de idiomas los keys de los mismos, que nos servirá después para saber que idiomas pasar al servicio. Esto también lo ponemos dentro del Load.

// Evento para guardar la lista de idiomas disponibles
// Trae el código del Idioma
ls.GetLanguageNamesAsync(AppId, Language.IetfLanguageTag);
 
// Evento para llenar los combos de Idiomas
// Trae la descripción del Idioma
ls.GetLanguagesAsync(AppId);

Ahora agregamos los handlers que se utilizan para traer los idiomas.

// Guarda la lista de idiomas disponibles
protected void ls_GetLanguagesCompleted(object sender, 
                    GetLanguagesCompletedEventArgs e)
{
    if (e.Error == null)
    {
        langcodes = e.Result;
    }
}
 
// Llena los combos de Idiomas
protected void ls_GetLanguageNamesCompleted(Object sender, 
                    GetLanguageNamesCompletedEventArgs e)
{
    if (e.Error == null)
    {
        comboOrigen.ItemsSource = e.Result;
        comboDestino.ItemsSource = e.Result;
 
        // Origen por defecto es Inglés
        comboOrigen.SelectedIndex = 
            langcodes.IndexOf("en");
        // Destino por defecto es Español
        comboDestino.SelectedIndex = 
            langcodes.IndexOf("es");
    }
}

Vamos a la parte más interesante, donde vamos a traducir el texto. Nosotros vamos a llamar al método que traduce, al ser asincrónico, cuando termine llamará al handler que especificamos en el Load.

private void botonTraducir_Click(object sender, 
                RoutedEventArgs e)
{
    if (comboOrigen.SelectedItem != null && 
        comboDestino.SelectedItem != null)
    {
        ls.TranslateAsync(AppId, textoOrigen.Text, 
            (langcodes[comboOrigen.SelectedIndex].ToString()), 
            (langcodes[comboDestino.SelectedIndex].ToString()));
    }
}
 
// Recibe el texto traducido del Servicio
protected void ls_TranslateCompleted(Object sender, 
                TranslateCompletedEventArgs e)
{
    if (e.Error == null)
    {
        textoDestino.Text = e.Result;
    }
}

Vemos un screen de la aplicación.

2 Pueden descargar el ejemplo aquí.

2 Comments

Comments have been disabled for this content.