ASP.NET から Google 翻訳を呼び出す
If you want to run through this walkthrough, please follow the guide on setting up our test environment.
Experience Level - Intermediate
序章
このドキュメントは、約 500 文字を翻訳できる Java Script を使用するとどうなるかを説明するのに非常に適していますが、より大きなドキュメントを翻訳する必要がある場合はほとんど説明されていません。
POST を使用する場合、これを 5000 文字まで増やすことができるため、投稿リクエストを Google API に送信して翻訳を受け取る独自のコードを開発しました。
最初のステップでは、クラスを App_Code フォルダーに追加して Translate という名前にする必要があります。ビルド アクションを Compile に設定するチュートリアルを思い出してください。
VB
Imports System.IOImports System.NetImports System.Web.Script.SerializationPublic Class Translate Shared Function GetTranslation(ByVal key As String, ByVal source As String, ByVal target As String, ByVal Text As String) As String ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Dim TranslatedString As String = "" Text = "q=" + Text Dim TranslateRequest As New Uri(String.Format("https://www.googleapis.com/language/translate/v2?key={0}&source={1}&target={2}&format=html", key, source, target)) Dim Req As WebRequest = WebRequest.Create(TranslateRequest) Req.Method = "POST" Req.Headers.Add("X-https-Method-Override", "GET") Req.ContentType = "application/x-www-form-urlencoded" Using ReqStr As Stream = Req.GetRequestStream() Dim encoding As New UTF8Encoding() Dim bytes As Byte() = encoding.GetBytes(Text) ReqStr.Write(bytes, 0, bytes.Length) End Using Dim ReturnStr As String Using sr = New StreamReader(Req.GetResponse.GetResponseStream) ReturnStr = sr.ReadToEnd() End Using Dim Reader As New JavaScriptSerializer Dim TranslateJSON As Dictionary(Of String, Object) = Reader.DeserializeObject(ReturnStr) Dim TranslateData As Dictionary(Of String, Object) If TranslateJSON.ContainsKey("data") Then TranslateData = TranslateJSON("data") If TranslateData.ContainsKey("translations") Then For Each pair In TranslateData.Item("translations")(0) TranslatedString = pair.Value.ToString() Next End If End If Return TranslatedString End FunctionEnd Class
Add a page
Within the Pages Section, Add a new page called GoogleTranslate, and then the HTML and code below.
HTML
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <script> function UpdateHiddenField(el, id) { nextElSibling(el).value = el.innerHTML; } function nextElSibling(el) { if (el.nextSibling) do { el = el.nextSibling } while (el && el.nodeType !== 1); return el; } </script></head><body> <form id="form1" runat="server"> <div style="max-width:1000px;margin:auto;"> <div style="clear:both;"> <asp:Label ID="KeyLabel" runat="server" AssociatedControlID="LgTo" Text="API Key"></asp:Label> <asp:TextBox ID="KeyValue" runat="server"></asp:TextBox> </div> <div style="float:left;width:50%;background-color:#ddd;"> <div> <asp:Label ID="LgFromLabel" runat="server" AssociatedControlID="LgFrom" Text="From"></asp:Label> <asp:DropDownList runat="server" ID="LgFrom"> <asp:ListItem Text="English" Value="en"></asp:ListItem> <asp:ListItem Text="Français" Value="fr"></asp:ListItem> <asp:ListItem Text="Deutsch" Value="de"></asp:ListItem> </asp:DropDownList> </div> <div style="min-height:400px;border:1px solid #ccc;" contenteditable="true" onkeyup="UpdateHiddenField(this)" id="ContentTextInput" runat="server"></div> <asp:HiddenField ID="ContentText" runat="server"/> </div> <div style="float:left;width:50%;background-color:#ccc;"> <div> <asp:Label ID="LgToLabel" runat="server" AssociatedControlID="LgTo" Text="To"></asp:Label> <asp:DropDownList runat="server" ID="LgTo"> <asp:ListItem Text="English" Value="en"></asp:ListItem> <asp:ListItem Text="Français" Value="fr"></asp:ListItem> <asp:ListItem Text="Deutsch" Value="de" Selected="True"></asp:ListItem> </asp:DropDownList> </div> <div style="min-height:400px;border:1px solid #bbb;" runat="server" id="ContentTrans"></div> </div> <div style="clear:both;text-align:center;"> <asp:Button runat="server" ID="Translation" Text="Translate"/> </div> </div> </form></body></html>
VB
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load End Sub Protected Sub GetTranslation_Click(sender As Object, e As EventArgs) Handles Translation.Click Dim Key As String = "Your Key" Dim source As String = LgTo.SelectedItem.Text.ToString Dim target As String = LgFrom.SelectedItem.Text.ToString Dim PageText As String = HttpUtility.HtmlDecode(ContentText.InnerHtml) Try ContentTrans.InnerHtml = HttpUtility.HtmlDecode(Translate.GetTranslation(Key, source, target, PageText)) Catch End Try End Sub
機能
この関数には 4 つの入力が必要です。これらは、キー、元の言語、元の言語、および翻訳するテキストです。
次に、リクエスト タイプとコンテンツ タイプを設定し、最も重要なヘッダーを追加して get メソッドをオーバーライドします。
これが完了したら、データをストリームとして Google に送信します (ReqStr)。次に、Google から返された JSON を保持する戻り文字列 (ReturnStr) を宣言し、応答文字列を読み取ります。
次のステップは、JavaScriptSerializer の作成です。これは、当時の私の開発スキルの最も弱い領域であったため、おそらく最も混乱を招きました。この最後のセクションが行うことは、必要な領域に到達するまでテキストの各セクションを引き出し、返されるテキストを Google から返される値として設定することです。これは世界で最も精巧なコードではないかもしれないので、整理する方法を見つけたら教えてください。
この例では、DIV コンテンツを別の内容に取り込みます。 (エディターと Google からの) 二重のデコードに注意してください。また、言語を示す 2 つのテキスト ボックスがあります。