• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

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

Exploit Васильевич

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

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

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

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

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

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

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
11,839
Симпатии
5,571
#2
есть каталог(700страниц) в PDF, который нужно перенести в эксель(CVS),
Это можно сделать с помощью ABBYY FineReader, правда программа платная.
некоторые записи в таблицах каталога нужно Перевести на другой язык
этот пункт не понятен.
2 Хватит ли для этого встроенного в эксель VBA?
не понятно, что именно вы хотите делать VB ?
1) Надо перевести PDF в эксель, с этим прекрасно справится ABBYY FineReader разобраться с ним не сложно.
 

Arbitr

Ассоциация VN
Сообщения
3,606
Симпатии
1,656
#3
да даже в фоксит ридере я помню выделял текст , просто в буфер обмена и потом в офис вставлял..

1 Насколько выполнима эта задача для неподготовленного человека?
а он комп умеет включть??)
2 Хватит ли для этого встроенного в эксель VBA?
а зачем он??

ну переводами явно не ексель занимается...
в общем я проблем не вижу regist, правильно сказал
перевести PDF в эксель, с этим прекрасно справится ABBYY FineReader
 

Exploit Васильевич

Активный пользователь
Сообщения
77
Симпатии
10
#4
Снимок.PNG

Это можно сделать с помощью ABBYY
Этот вопрос я уже решил, остался вопрос с переводом.



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

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

Arbitr

Ассоциация VN
Сообщения
3,606
Симпатии
1,656
#5
то бишь цикл, взял из первой ячейки вставил в поле переводчика. скопировл переведенное и перезаписал?
не думаю что удастся совместить офис и переводчик
делай все csv переводи разом весь док и потом обратно в ексель..?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#6
Exploit Васильевич, да. Можно.
Дайте пример исходной структуры Excel или CSV-файла, а также несколько строк для перевода (прикрепите файл в архиве ZIP к сообщению).
 

Arbitr

Ассоциация VN
Сообщения
3,606
Симпатии
1,656
#7
Dragokas, оо, интересно глянуть и взять на вооружение
 

Exploit Васильевич

Активный пользователь
Сообщения
77
Симпатии
10
#8
Дайте пример исходной структуры Excel или CSV-файла, а также несколько строк для перевода (прикрепите файл в архиве ZIP к сообщению
Исходная таблица содержит в первой колонке иероглифы для перевода, а конечная перевод с необходимым форматированием ( Названия полей – первая строка.
марка машины – первые два поля пустые, в третьей – название марки)
 

Вложения

Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#9
Exploit Васильевич, я так понимаю - там японский язык.
Вы можете в принципе установить последнюю версию Prompt. Судя с оффсайта японский поддерживается. Может встраиваться в Excel.
Единственное, что платный. Если задача - единоразовая, trial-а должно біть достаточно.Перевода объединенных ячеек будет достаточно?
 

Вложения

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#10
Для всех остальных - Google уже давно прикрыл публичный доступ к своему API. Теперь только за денежку.
Но никто не запрещает прикинуться браузером и переводить с одного IP до 10.000 знаков.

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

Вложения

Exploit Васильевич

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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#12
Код макроса можно посмотреть, нажав Левый Alt + F11, и выбрав в левом окне в "Object Browser"-e один из модулей.

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

Вложения

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#13
Комментарии к макросам # 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
 
Последнее редактирование: