2011年4月26日火曜日

BingAPI を利用した翻訳アクティビティ

ふらふらと Code Recipe をさまよっていると見慣れないサンプルがあったので、それをそのままアクティビティ化してみました。本当にそのままですw

1: Imports System.Activities
2: Imports System.Net
3: Imports System.Text
4: 
5: Public Class BingTranslaterActivity
6:     Inherits AsyncCodeActivity
7: 
8:     Public Property OriginalStrings As InArgument(Of String)
9:     Public Property EncodeFrom As String = "ja"
10:     Public Property EncodeTo As String = "en"
11: 
12:     Public Property TranslatedStrings As OutArgument(Of String)
13: 
14:     Private Delegate Function translateUseBingDelegate(ByVal original As String) As String
15: 
16:     Public Sub New()
17:         Me.DisplayName = "Bing で翻訳"
18:     End Sub
19: 
20:     Protected Overrides Function BeginExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult
21:         Dim inputStrings = context.GetValue(Me.OriginalStrings)
22:         Dim asyncTranslateDel = New translateUseBingDelegate(AddressOf TranslateUseBing)
23:         context.UserState = asyncTranslateDel
24: 
25:         Return asyncTranslateDel.BeginInvoke(inputStrings, callback, state)
26:     End Function
27: 
28:     Protected Overrides Sub EndExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal result As System.IAsyncResult)
29:         Dim asyncTranslateDel = TryCast(context.UserState, translateUseBingDelegate)
30:         Dim resultStrings = asyncTranslateDel.EndInvoke(result)
31:         TranslatedStrings.Set(context, resultStrings)
32:     End Sub
33: 
34:     Private Function TranslateUseBing(ByVal original As String) As String
35:         Dim bingApiKey = "取得したBingAPIキー"
36:         Dim result = ""
37:         Dim escStrings = Uri.EscapeDataString(original)
38: 
39:         Using webCl As New WebClient
40:             webCl.Encoding = Encoding.UTF8
41:             Dim bingAddress As String = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId={0}&text={1}&from={2}&to={3}"
42:             Dim callAddress As String = String.Format(bingAddress, bingApiKey, escStrings, Me.EncodeFrom, Me.EncodeTo)
43: 
44:             Try
45:                 Dim resultBody = webCl.DownloadString(callAddress)
46:                 result = XDocument.Parse(resultBody).Elements.First.Value
47:             Catch ex As Exception
48: 
49:             End Try
50:         End Using
51: 
52:         Return result
53:     End Function
54: 
55: End Class

以前に書いた非同期での Web 通信方法をまったくそのまま利用し、このような形で BingAPI を呼び出します。

Translate1

このような形でワークフローにアクティビティを配置、プロパティを設定し・・・

Translate2

実行するとこのように翻訳結果が得られます。ワークフローにおけるアクティビティは別にそれほど難しいことをやるものを用意する必要はなく、今回のように一つ一つは簡単な処理だけども、組み合わせて利用する事で色々面白いことができるのがキモだと思っています。ただここでどの程度の粒度でアクティビティにするか、そこが非常にセンスの問われるところだと。

0 件のコメント:

コメントを投稿