среда, 24 февраля 2016 г.

ASP.NET Сервис перевода на сайте

Данный пример позволит вам создать сервис перевода на сайте, используя технологию api перевода от yandex. Используйте пример для маркетинговых задач, т.е. для продвижения сайта путем создания виджетов и других частей сайта.
Пример использования данной технологии на сайте можно посмотреть в этом разделе: http://www.leadersoft.ru/Rus/Help/Job/Default.aspx?go=product&pid=938
О переводчике
Компания yandex разработала api интерфейс для перевода текстов. Ссылка на интерфейс https://tech.yandex.ru/translate/. Он имеет некоторые ограничения, но позволяет на сайте создать раздел для перевода информации, например, новостей. Попробовать перевод текста от сервиса yandex можно по этой ссылке: https://translate.yandex.ru/
Описание файлов
Сам проект ASP.NET «Переводчик» состоит из нескольких файлов. 
Вот они
  • Yandex.vb – этот класс содержит основные функции для работы с сервисом перевода и базой данных
  • Yandex.css – это пример для настройки стилей страницы примера
  • Freelace_job.accdb – база данных Microsoft Access с текстом для перевода
  • Default.aspx – страница примера
  • Web.config – содержит настройка для подключения базы данных
  • SiteJob.xsd – это набор данных для работы с базой данных
Microsoft ASP.NET. Проект «Переводчик»
Описание интерфейса
Интерфейс страницы перевода Default.aspx состоит из 2 кнопок.
  • «Перевести текст. Всего строк=». При нажатии на эту кнопку текст будет переведен, т.е. из базы данных будет считано столько строк, сколько указано с кнопкой (по умолчанию 1)
  • «Посмотреть LOG перевода». При нажатии на эту кнопку будет отображен лог перевода. Лог нужен для того, чтобы «увидеть» как прошел перевод. На сайт мы не посылаем сообщения об ошибках перевода, т.к. это нарушит его структуру.
Запуск примера на сайте
Если открыть файл Default.vb страницы Default.aspx, то можно увидеть следующую информацию. При нажатии кнопки ButtonTranslate срабатывают команды translate и translate-log. Первая переводит текст, а вторая отображает лог перевода
Protected Sub ButtonTranslate_Command(sender As Object, e As CommandEventArgsHandles ButtonTranslate.Command, ButtonLog.Command
    ' Переводим текст
    If e.CommandName = "translate" Then
        Dim ya As New Yandex
        ya.TranslateDatabase(TrueMe.MaxRecords.Text)
    End If
    ' Отображаем последние строки лога перевода
    If e.CommandName = "translate-log" Then
        Dim FileFull As String = HttpContext.Current.Request.MapPath("~/App_Data/freelancer/Yandex_Log.txt")
        Dim Lines() As String = IO.File.ReadAllLines(FileFull)
        Dim Buffer As String = ""
        For i As Integer = Lines.Length - 1 To Lines.Length - Me.MaxRecords.Text Step -1
            If i >= 0 Then
                Buffer = Buffer & (Lines(i) & "<br />")
            End If
        Next
        Dim html As New Literal
        html.Text = Buffer
        Me.PlaceLog.Controls.Add(html)
    End If
End Sub
Алгоритм перевода в Yandex.vb
Получаем api ключ от yandex сервиса и записываем его в класс в виде свойства только для чтения
   Private ReadOnly Property ApiKey() As String
       Get
           Return "trnsl.1.1.?.?.?"
       End Get
   End Property
Создаем функцию, которая будет писать данные перевода в лог файла. Она нужна для сохранения ошибок и результата перевода.
 Private Sub LogWrite(txt As String)
     Dim FileFull As String = HttpContext.Current.Request.MapPath("~/App_Data/freelancer/Yandex_Log.txt")
     IO.File.AppendAllText(FileFull, Now() & " " & txt & vbNewLine)
 End Sub
Создаем главную функцию перевода всех строк текста из базы данных. Параметр MaxRecords управляет числом переводимых записей. ButtobClick – определяет информацией, что надо сделать. Если True, то была нажата кнопка на сайте, если False, то перевод ведется автоматически с шагом 10 минут.
' Перевести текст. Максимально 100 записей из базы данных
 Public Sub TranslateDatabase(Optional ButtonClick As Boolean = FalseOptional MaxRecords As Integer = 100)
     ' Загружаем записи
     Dim adp As New SiteJobTableAdapters.JOB_TranslateTableAdapter
     Dim tbl As New SiteJob.JOB_TranslateDataTable
     adp.Fill(tbl)
     ' Переводим текст
     Dim MaxRow As Integer = 0
     For Each row As SiteJob.JOB_TranslateRow In tbl
         TranslateStringAsync({row.Name & "||" & row.ShortDescr}, row.ProjectID)
         MaxRow += 1
         If MaxRow >= MaxRecords Then
             Exit For
         End If
     Next
     ' Освобождаем ресурсы
     tbl.Dispose()
     adp.Dispose()
 End Sub
Для перевода текста используем асинхронную функцию загрузки из Интернета, т.к. нам важно, чтобы наш сайт не зависал при переводе.
Public Sub TranslateStringAsync(TextEnglish() As String, ProjectID As String)
      Try
          ' Загружаем файл
          Dim client As WebClient = New WebClient()
          '  Определяем функцию завершения загрузки
          AddHandler client.DownloadStringCompleted, AddressOf DownloadStringCompleted
          ' Определяем функцию отображения загрузки
          AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressCallback
          ' Определяем страницу загрузки с параметрами
          Dim uri As Uri = New Uri("https://translate.yandex.net/api/v1.5/tr.json/translate")


          ' Запускаем асинхронную загрузку данных и передаем в поток код проекта
          client.DownloadStringAsync(uri, ProjectID)
      Catch ex As Exception
          ResponseWrite("DownloadFileAsync ... <br />" & ex.Message.ToString)
      End Try
  End Sub
После перевода получаем результат e.result в формате json, обрабатываем его, и сохраняем перевод в базе данных. При ошибке отправляем информацию о ней лог в базы данных.


  ' Завершена загрузка
  Private Sub DownloadStringCompleted(sender As Object, e As DownloadStringCompletedEventArgs)
      Try
          If e.Cancelled = False AndAlso e.Error Is Nothing Then
              ' Разбор текста перевода
GetTextJson(e.Result, ProjectID)


              Catch ex As Exception
              End Try
          End If
          If e.Error IsNot Nothing Then
          End If
      Catch ex As Exception
      End Try
  End Sub
Для обработки результата перевода нужна функция разбора текста json. Алгоритм указан ниже.
Public Function GetTextJson(json As String, ProjectID As StringAs String
            Dim ser As New JavaScriptSerializer()
            Dim qry As Dictionary(Of StringObject) = TryCast(ser.DeserializeObject(json), Dictionary(Of StringObject))
            If qry Is Nothing Then
                ' Ошибка разбора файла. Он не имеет формат json
                Return ""
            End If


End Function
При переводе возможны ошибки, которые выдает yandex сервис.
'401: Неправильный ключ API
'402: Ключ API заблокирован
'403: Превышено суточное ограничение на количество запросов
'404: Превышено суточное ограничение на объем переведенного текста
'413: Превышен максимально допустимый размер текста
'422: Текст не может быть переведен
'501: Заданное направление перевода не поддерживается
ЗАКЛЮЧЕНИЕ
Исходный код, включая другие примеры, можно купить по этой ссылке: Купить альбом решений ASP.NET с примерами задач


Комментариев нет: