Windows Phone 7调用必应翻译服务

  这讲是介绍如何在Windows Phone上调用必应翻译服务。想必大家也知道必应为我们提供了很多服务,诸如搜索、地图、翻译等。前面已经介绍了如何在Windows Phone上调用必应的地图服务,今天调用必应的翻译服务,在它的服务中包含36种以上语言,包括简体中文、繁体中文等。下面是一个快照。有兴趣的朋友赶快行动吧!

  

  

效果图如下

        起始界面

 

    没有选择语言时弹出提示框

 

    没有输入数据时弹出提示框

 

      翻译完成后界面

 

  好啦!开始吧.

  Step 1:创建语言类Language.cs

     每种语言都有两个属性,Name,Code。如上俩图中文的Name是chinese simplified,Code是zh-CHS.

 public class Language
{
    public string Code { get; set; }
    public string Name { get; set; }
}

      

  Step 2:用户接口

      我们定义了一些控件,并绑定Language的Name属性,来显示数据。

<ScrollViewer>
<StackPanel Orientation="Vertical">
<TextBlock FontSize="30">源语言:</TextBlock>
<ListBox x:Name="lbxFrom" Height="160" Margin="0,10,0,10" Width="440" HorizontalAlignment="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" FontSize="30"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Name="txtOrign" Text="" FontSize="25" TextWrapping="Wrap" Height="160" HorizontalAlignment="Left" Width="440"/>
<TextBlock FontSize="30">目标语言:</TextBlock>
<ListBox x:Name="lbxTo" Height="160" Margin="0,10,0,10" Width="440" HorizontalAlignment="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" FontSize="30"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Name="btnTranslate" Content="翻译"
Click="btnTranslate_Click" />
<TextBox Name="txtTarget" IsReadOnly="True" FontSize="30" TextWrapping="Wrap" Height="160" HorizontalAlignment="Left" Width="440"/>
</StackPanel>
</ScrollViewer>
</UserControl>

 

在MainPage.cs文件中定义三个List<T>,来保存数据。

          private List<string> codes;
              private List<string> names;
              private List<Language> languages;

 

  Step 3:使用Bing SOAP 服务

      添加服务引用,地址为:http://api.microsofttranslator.com/V2/Soap.svc,LanguageServiceClient是一个Proxy,提供了一些调用服务的方法。下面我们定义一个对象

private BTS.LanguageServiceClient proxy;

要使用必应的翻译服务我们首先必须获取一个APP_ID,到http://cn.bing.com/developers/createapp.aspx网站,输入信息来获取。我注册的ID也可以使用,请看下图。

 

  接下来我们注册事件 

  proxy.GetLanguagesForTranslateCompleted += new EventHandler<BTS.GetLanguagesForTranslateCompletedEventArgs>(proxy_GetLanguagesForTranslateCompleted);
      proxy.GetLanguageNamesCompleted += new EventHandler<BTS.GetLanguageNamesCompletedEventArgs>(proxy_GetLanguageNamesCompleted);

      proxy.TranslateCompleted += new EventHandler<BTS.TranslateCompletedEventArgs>(proxy_TranslateCompleted);

其中GetLanguagesForTranslateCompleted事件有一个GetLanguagesForTranslateCompletedEventArgs类型的参数。包含一些从服务中得到的数据,如Language的Code值。

GetLanguageNamesCompleted事件有一个GetLanguageNamesCompletedEventArgs类型的参数,包含Language的Name值。

TranslateCompleted事件将我们输入原语言的数据翻译为目标语言的数据。

  private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
proxy.GetLanguagesForTranslateCompleted += new EventHandler<BTS.GetLanguagesForTranslateCompletedEventArgs>(proxy_GetLanguagesForTranslateCompleted);
proxy.GetLanguageNamesCompleted += new EventHandler<BTS.GetLanguageNamesCompletedEventArgs>(proxy_GetLanguageNamesCompleted);
proxy.TranslateCompleted += new EventHandler<BTS.TranslateCompletedEventArgs>(proxy_TranslateCompleted);

proxy.GetLanguagesForTranslateAsync(APP_ID);
}

public void proxy_GetLanguagesForTranslateCompleted(object sender, BTS.GetLanguagesForTranslateCompletedEventArgs e)
{
codes = e.Result.ToList();

proxy.GetLanguageNamesAsync(APP_ID, "en", e.Result);
}

public void proxy_GetLanguageNamesCompleted(object sender, BTS.GetLanguageNamesCompletedEventArgs e)
{
names = e.Result.ToList();
loadLanguages();
}

public void proxy_TranslateCompleted(object sender, BTS.TranslateCompletedEventArgs e)
{
txtTarget.Text = e.Result;
}

 

 现在给ListBox对象绑定数据

   private void loadLanguages()
{
for (int index = 0; index < codes.Count; index++)
{
languages.Add(new Language
{
Code = codes[index],
Name = names[index]
});
}

lbxFrom.ItemsSource = languages;
lbxTo.ItemsSource = languages;
}

 

 定义Translate()方法来完成翻译

  private void Translate()
{
if (lbxFrom.SelectedItem == null || lbxTo.SelectedItem == null)
{
MessageBox.Show("请先选择语言","提示",MessageBoxButton.OK);

return;
}

if (this.txtOrign.Text.Trim().Length==0)
{
MessageBox.Show("请先输入要翻译的单词或语句","提示",MessageBoxButton.OK);

return;
}
else
{
Language from = lbxFrom.SelectedItem as Language;
Language to = lbxTo.SelectedItem as Language;

proxy.TranslateAsync(APP_ID, txtOrign.Text, from.Code, to.Code);
}
}
}

 

完整MainPage.xaml代码

<phone:PhoneApplicationPage
x:Class="BingTranslatorService.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ScrollViewer>
<StackPanel Orientation="Vertical">
<TextBlock FontSize="30">源语言:</TextBlock>
<ListBox x:Name="lbxFrom" Height="160" Margin="0,10,0,10" Width="440" HorizontalAlignment="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" FontSize="30"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Name="txtOrign" Text="" FontSize="25" TextWrapping="Wrap" Height="160" HorizontalAlignment="Left" Width="440"/>
<TextBlock FontSize="30">目标语言:</TextBlock>
<ListBox x:Name="lbxTo" Height="160" Margin="0,10,0,10" Width="440" HorizontalAlignment="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" FontSize="30"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Name="btnTranslate" Content="翻译"
Click="btnTranslate_Click" />
<TextBox Name="txtTarget" IsReadOnly="True" FontSize="30" TextWrapping="Wrap" Height="160" HorizontalAlignment="Left" Width="440"/>
</StackPanel>
</ScrollViewer>

</Grid>
</Grid>

</phone:PhoneApplicationPage>
</UserControl>

 

完整MainPage.csl代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace BingTranslatorService
{
public partial class MainPage : PhoneApplicationPage
{
private List<string> codes;
private List<string> names;
private List<Language> languages;
private BTS.LanguageServiceClient proxy;

//http://cn.bing.com/developers/createapp.aspx
private readonly string APP_ID = "3DAEE5B978BA031557E739EE1E2A68CB1FAD5909";
public MainPage()
{
InitializeComponent();
codes = new List<string>();
names = new List<string>();
languages = new List<Language>();
proxy = new BTS.LanguageServiceClient();
this.Loaded += new RoutedEventHandler(PhoneApplicationPage_Loaded);
}

private void btnTranslate_Click(object sender, RoutedEventArgs e)
{
Translate();
}

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
proxy.GetLanguagesForTranslateCompleted += new EventHandler<BTS.GetLanguagesForTranslateCompletedEventArgs>(proxy_GetLanguagesForTranslateCompleted);
proxy.GetLanguageNamesCompleted += new EventHandler<BTS.GetLanguageNamesCompletedEventArgs>(proxy_GetLanguageNamesCompleted);
proxy.TranslateCompleted += new EventHandler<BTS.TranslateCompletedEventArgs>(proxy_TranslateCompleted);

proxy.GetLanguagesForTranslateAsync(APP_ID);
}

public void proxy_GetLanguagesForTranslateCompleted(object sender, BTS.GetLanguagesForTranslateCompletedEventArgs e)
{
codes = e.Result.ToList();

proxy.GetLanguageNamesAsync(APP_ID, "en", e.Result);
}

public void proxy_GetLanguageNamesCompleted(object sender, BTS.GetLanguageNamesCompletedEventArgs e)
{
names = e.Result.ToList();
loadLanguages();
}

public void proxy_TranslateCompleted(object sender, BTS.TranslateCompletedEventArgs e)
{
txtTarget.Text = e.Result;
}

private void loadLanguages()
{
for (int index = 0; index < codes.Count; index++)
{
languages.Add(new Language
{
Code = codes[index],
Name = names[index]
});
}

lbxFrom.ItemsSource = languages;
lbxTo.ItemsSource = languages;
}



private void Translate()
{
if (lbxFrom.SelectedItem == null || lbxTo.SelectedItem == null)
{
MessageBox.Show("请先选择语言", "提示", MessageBoxButton.OK);

return;
}

if (this.txtOrign.Text.Trim().Length == 0)
{
MessageBox.Show("请先输入要翻译的单词或语句", "提示", MessageBoxButton.OK);

return;
}
else
{
Language from = lbxFrom.SelectedItem as Language;
Language to = lbxTo.SelectedItem as Language;

proxy.TranslateAsync(APP_ID, txtOrign.Text, from.Code, to.Code);
}
}
}
}
</UserControl>

 

 

源码下载

posted @ 2011-01-03 17:28  ForrestWoo  阅读(1312)  评论(3编辑  收藏  举报