Перевести текст на другой язык

Тема в разделе "Макросы Word, Excel (VBA)", создана пользователем Exploit Васильевич, 30 янв 2014.

  1. Exploit Васильевич
    Оффлайн

    Exploit Васильевич Пользователь

    Сообщения:
    77
    Симпатии:
    10
    Всем привет! Прошу совета тех кто имеет опыт в этом деле.

    Cитуация такая : есть каталог(700страниц) в PDF, который нужно перенести в эксель(CVS), нюанс состоит в том что некоторые записи в таблицах каталога нужно Перевести на другой язык Контора далека от Ит(сам не прогер, но так как вся инфраструктура на мне - больше некому ) . Отсюда вытекают следущие вопросы:

    1 Насколько выполнима эта задача для неподготовленного человека?

    2 Хватит ли для этого встроенного в эксель VBA?

    3 И сколько времени минимум это может занять? (дали несколько дней).

    P.S я люблю интересные задачи, но к этой даже не знаю с какой стороны подступиться-так что буду рад любому совету.
     
  2. regist
    Оффлайн

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    Это можно сделать с помощью ABBYY FineReader, правда программа платная.
    этот пункт не понятен.
    не понятно, что именно вы хотите делать VB ?
    1) Надо перевести PDF в эксель, с этим прекрасно справится ABBYY FineReader разобраться с ним не сложно.
     
  3. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    да даже в фоксит ридере я помню выделял текст , просто в буфер обмена и потом в офис вставлял..

    а он комп умеет включть??)
    а зачем он??

    ну переводами явно не ексель занимается...
    в общем я проблем не вижу regist, правильно сказал
     
  4. Exploit Васильевич
    Оффлайн

    Exploit Васильевич Пользователь

    Сообщения:
    77
    Симпатии:
    10
    Снимок.PNG

    Этот вопрос я уже решил, остался вопрос с переводом.



    Для автоматизации процесса(в файле 20000 строк).

    На данный момент проблема в том что есть несколько тысяч колонок с иероглифами, которые нужно перевести.И тут вопрос: можно ли написать средствами екселя макрос позволяющий находить и переводить сторонними средствами(гугл транслейт например) иероглифы из первого столбца?
     
  5. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    то бишь цикл, взял из первой ячейки вставил в поле переводчика. скопировл переведенное и перезаписал?
    не думаю что удастся совместить офис и переводчик
    делай все csv переводи разом весь док и потом обратно в ексель..?
     
    Последнее редактирование: 31 янв 2014
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Exploit Васильевич, да. Можно.
    Дайте пример исходной структуры Excel или CSV-файла, а также несколько строк для перевода (прикрепите файл в архиве ZIP к сообщению).
     
    Kиpилл нравится это.
  7. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    Dragokas, оо, интересно глянуть и взять на вооружение
     
  8. Exploit Васильевич
    Оффлайн

    Exploit Васильевич Пользователь

    Сообщения:
    77
    Симпатии:
    10
    Исходная таблица содержит в первой колонке иероглифы для перевода, а конечная перевод с необходимым форматированием ( Названия полей – первая строка.
    марка машины – первые два поля пустые, в третьей – название марки)
     

    Вложения:

    Последнее редактирование: 1 фев 2014
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Exploit Васильевич, я так понимаю - там японский язык.
    Вы можете в принципе установить последнюю версию Prompt. Судя с оффсайта японский поддерживается. Может встраиваться в Excel.
    Единственное, что платный. Если задача - единоразовая, trial-а должно біть достаточно.
    --- Объединённое сообщение, 1 фев 2014, Дата первоначального сообщения: 1 фев 2014 ---
    Перевода объединенных ячеек будет достаточно?
     

    Вложения:

    Exploit Васильевич и Arbitr нравится это.
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Для всех остальных - Google уже давно прикрыл публичный доступ к своему API. Теперь только за денежку.
    Но никто не запрещает прикинуться браузером и переводить с одного IP до 10.000 знаков.

    Можно даже получить перевод в виде голоса.
    Вот несколько примеров.
    Пару от EducatedFool.
    1 - от raxp:
    • нужно зарегистрировать библиотеку батником regdynwrapx.bat от имени Админа,
    • изменить в файле runsound.vbs строку MsgBox(Wrap.translate("Утка крякает", "fr", "ru", 1)) на то, что Вам нужно.
    • запустить runTranslator.cmd
     

    Вложения:

    Kиpилл, Exploit Васильевич и Arbitr нравится это.
  11. Exploit Васильевич
    Оффлайн

    Exploit Васильевич Пользователь

    Сообщения:
    77
    Симпатии:
    10
    Спасибо, у меня тоже крутилось в голове что это можно сделать через POST-запросы, но в програмировании я не силен (только начал читать про VBA). макрос перевел все заголовки, некоторых строк , как это исправить?
    Снимок.PNG

    Не могли бы вы выложить код макроса с коментариями (дико интересно как он работает), еще раз спасибо!
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Код макроса можно посмотреть, нажав Левый Alt + F11, и выбрав в левом окне в "Object Browser"-e один из модулей.

    Да, я специально так сделал.
    Сейчас изменил язык на "автоопределение". Т.к. по данным Google в столбце язык там то японский, то китайский ;)
    Код не успел прокомментировать. Позже...
    Результат перевода и макрос ниже. Косяки есть, но в целом иероглифов уже нет.
     

    Вложения:

    Exploit Васильевич, Kиpилл и akok нравится это.
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Комментарии к макросам # 1/2.

    Код (vb.net):
    Sub Перевести()
     
        'Application.ScreenUpdating = False 'ускорение вывода на экран (отключение обновления экрана)
     
        LastCell = Cells(Rows.Count, 1).End(xlUp).Row 'поиск последней заполненной ячейки в столбце 1
     
        Progress.Show 0 'показать форму Progress
     
        For y = 1 To LastCell 'цикл перебора от 1 до последней заполненной ячейки
     
            Progress.Label1.Caption = String(Int(y / LastCell * 70) + 1, "|") 'обновление количества "палок" в прогрессбаре
            'обновить форму,
            Progress.Repaint
            ' разгрузить ресурсы ЦПУ, отдав их большую часть другим программам, чтобы не вызывать зависания
            DoEvents
     
            With Cells(y, 1)
                .Activate 'перейти к ячейке с координатами { y,1 }
                'если кол-во одиночных ячеек в объединенной области превышает 1
                'иначе говоря - если ячейки объединены
                If .MergeArea.Cells.Count > 1 Then
                    If Len(.Value) <> 0 Then 'если значение непустое (если длина значения > 0)
                        s = ModFunc.Translate(.Value, "en", "ja") 'вызвать функцию Translate из модуля ModFunc
                        If Len(s) <> 0 Then .Value = s 'если вернула непустое значение, присвоить ячейке { y,1 } это значение
                    End If
                End If
            End With
        Next

        Unload Progress 'выгрузить форму прогрессбара
        Application.ScreenUpdating = True 'включить обновление экрана

    End Sub
    Код (vb.net):
     'собственно сама функция - ей передаются по значению аргументы:
    ' 1) текст для перевода
    ' 2) язык, на который нужно перевести
    ' 3) исходный язык (опционально), иначе - автоопределение Googl-ом
    Function Translate$(ByVal TextToBeTranslated$, ByVal resultLanguageCode$, _
                        Optional ByVal sourceLanguageCode$ = "")
        On Error Resume Next 'игнорирование любых критических ошибок при выполнении кода
        ' переводит текст TextToBeTranslated$ с языка sourceLanguageCode$
        ' на язык resultLanguageCode$, используя сервис переводов Google Translate
    '    Application.Volatile True 'форсировать автообновление формул
        Set ADOStream = CreateObject("ADODB.Stream") 'создаем экземпляр объекта ADO.Stream

       ' часть ниже преобразовует в UTF-8 без BOM (хидера) текст для перевода

        With ADOStream
            'кодировка - UTF-8, режим работы - adModeReadWrite (чтение и запись), тип данных - 2 - текст
            .Charset = "utf-8": .Mode = 3: .Type = 2: .Open
            'записываем в поток текст, обновляем, устанавливаем позицию курсора в 0
            .WriteText TextToBeTranslated: .Flush: .Position = 0
            'переключаем тип на бинарный, читаем первые 3 байта (таким образом игнорируем их)
            'читаем в переменную остальную часть, закрываем поток
            .Type = 1: .Read 3: ByteArrayToEncode = .Read(): .Close
        End With

        ' Эта часть пробразовует текст в URL-Encode

        For i = 0 To UBound(ByteArrayToEncode)
            iAsc = ByteArrayToEncode(i)
            Select Case iAsc    ' переводим текст в кодировку, понятную Google
                Case 32: sTemp$ = "+"    'space
                Case 48 To 57, 65 To 90, 97 To 122: sTemp$ = Chr(ByteArrayToEncode(i))
                Case Else: sTemp$ = "%" & Hex(iAsc)     'Chr(iAsc)
            End Select
            txt$ = txt$ & sTemp$
        Next

        ' формируем ссылку, по которой Google выдаст нам файл с переводом
        URL$ = "http://translate.google.com.ua/translate_a/t?client=json&text=" & _
               txt$ & "&hl=" & resultLanguageCode$ & "&sl=" & sourceLanguageCode$
        Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")    ' скачиваем файл
        ' Отправляем GET-запрос
        XMLHTTP.Open "GET", Replace(URL$, "\", "/"), "False": XMLHTTP.send
        If XMLHTTP.statustext = "OK" Then
            LocalPath$ = Environ("TMP") & "\google.txt"
            With ADOStream    ' перекодировка файла
                .Type = 1: .Open: .Write XMLHTTP.responseBody
                ' сохраняем ответ сайта во временный файл
                .SaveToFile LocalPath$, 2
                .Close: .Type = 2: .Charset = "utf-8": .Open:
                .LoadFromFile LocalPath$    ' загружаем данные из файла
                Translate$ = .ReadText   ' считываем текст файла в переменную Translate$
            End With
            ' часть выше написана ущербно - можно было обойтись и без временного файла

            On Error Resume Next
            ' вырезаем нужный текст из ответа, находя параметр "trans" и "orig"
            Translate$ = Split(Translate$, """trans"":""")(1)
            Translate$ = Split(Translate$, """,""orig")(0)
            Translate$ = Replace(Translate$, "quot;", Chr(39))
            If Translate$ = " null, " Then Translate$ = "Не переведено"
        End If
        Set XMLHTTP = Nothing: Set ADOStream = Nothing 'очищаем объекты
    End Function
    Код (vb.net):
     'функция определяет является ли хоть один символ в строке  юникодным (китайским/ японским) (все, до чего смог додуматься за пару мин. :))
    Function isIeroglif(s As String)
        'Перечисляем каждый символ в слове
        For n = 1 To Len(s)
            ' получаем двухбайтный код символа
            i = AscW(Mid(s, n, 1))
            ' если код выше 255 или ниже 0, то это юникод -> выходим из функции
            If (i > 255) Or (i < 0) Then isIeroglif = True: Exit Function
        Next
    End Function
     
    Последнее редактирование: 20 фев 2014

Поделиться этой страницей