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.
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.
Pueden descargar el ejemplo aquí.