Перенос словарей из ABBYY Lingvo в Stardict

18:55

Свершилось!!!
Наконец-то можно полностью отказаться от работы с ABBYY Lingvo в эмуляторе под Linux’ом и полностью перейти на использование Stardict со словарями из Lingvo.

Пролог

Почти ровно через год после написания сей статьи в мои руки попала 12-я лингва.
Всё написанное ниже применимо и к ней. Словари так же без проблем декомпилируются, а потом конвертируются в формат стардикта. Так что дерзайте, ищите в Сети нужные для замены байтики в dslcomp.exe и вперёд!

Вступление

После того, как я узнал о том, что словари Lingvo можно декомпилировать в исходные тексты, я загорелся желанием написать конвертер для преобразования их в формат StarDict‘а. У меня всё не было времени взяться за это. На эти майские праздники время таки появилось. Я наконец-то закончил один из своих больший проектов и решил взяться за конвертер вплотную. Ещё больше меня подстёгивало то, что в мои руки наконец-то попал ABBYY Lingvo 11 Multilingual, в котором были украинские(!) словари. Это было как раз то, о чём я так слёзно просил по телефону у девушки из АБИ, любезно позвонившей мне аж из самой Москвы, дабы провести что-то вроде опроса или анкетирования. И хотя один так же немаленький проект по переводу на украинский я уже закончил, не прибегая к услугам Lingvo, возможность использовать эти словари в будущем меня ох как подстёгивала.

Однако, каково же было моё удивление, когда я узнал о том, что оказывается конвертер dsl2stardict уже существует! Итого, вместо того, чтобы неопределённо долго писать свой собственный конвертер, я взял уже готовый и, практически ничего не меняя в нём, получил нужный результат.

Согласитесь, это более, чем приятно :)

Я понимаю, что нарушу авторские права компании АБИ, если выложу конвертированные словари для общего доступа, поэтому не ожидайте найти их здесь. Однако из-за того, что обещанные симпатишные девушки из киевского офиса украинского подразделения компании АБИ так и не заглянули ко мне в гости :), я немного обиделся и решил написать подробную инструкцию о том, как можно самостоятельно добиться нормальной работы StarDict со словарами из ABBYY Lingvo .

Итак, равно как и в предыдущих двух статьях, для начала я перечислю список необходимых инструментов:

  • словари Lingvo в формате .lsd
  • компилятор словарей DslComp.exe с необходимыми библиотеками
    (Awl.dll, FineObj.dll, LangInfoUnicode.dll, Lingvo0.dll, msvcr71.dll)
  • эмулятор wine
  • makedict в исходных текстах + софт, необходимый для его сборки
  • собственно, сам stardict с утилитой dictzip

Первые два пункта есть на оригинальных компакт-дисках или их образах (версия 11ML вышла на двух CD и ниже будет описана работа именно с ней).

Общая схема довольно проста:

  1. конвертируем lsd в dsl (dslcomp.exe)
  2. собираем makedict (make)
  3. преобразовываем словари из формата dsl в формат stardict (makedict)
  4. пользуемся :)

В каждом из пунктов есть свою нюансы, о которых будет рассказано ниже.

1. Для начала нам понадобится пропатчить екзешник. Собственно, это и есть нарушение копирайтов. Подробности о том, как это сделать в линухе, смотрите в первой статье.

Вот байты, которые нужно исправить (DslComp.exe ML 11.0.0.486, 1 115 072 байта):
0003C22F: 27->68
0003C298: CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC->83C6048D4424145650E82B68FCFFEBA7
00050881: 84->32
00053CE2: 01->00

Запускаем компилятор wine DslComp.exe и преобразовываем нужные нам словари в формат DSL.

Теперь нам понадобится немного подправить полученные исходники некоторых словарей, удалив в них ссылки на wav-файлы. Это нужно выполнить по той причине, что из-за отстутствия оных stardict показывает пустые карточки там, где есть звук. Лично мне «аудиосопровождение» абсолютно не нужно, поэтому я смело удалил эти ссылки.

Выполняется данная операция серией следущих простых команд (которые, слегка подшаманив, можно объединить в универсальный скрипт):

iconv -f utf16 -t utf8 LingvoUniversalER.dsl | \
sed -r s/\\[s\].+\.wav\\[\\/s\]// >LingvoUniversalER.dsl.utf8
iconv -f utf8 -t utf16 LingvoUniversalER.dsl.utf8 > LingvoUniversalER.dsl
rm -f LingvoUniversalER.dsl.utf8

На подбирание нужного регулярного выражения я потратил пару часов.
Если у iconv‘а возникнут проблемы с некоторыми символами, воспользуйтесь опцией -c.

Следует отметить, что существует возможность выдрать wav’ы из файла со звуком, однако, как я уже говорил, лично мне это не надо было. К тому же понятия не имею о том, как stardict работает со звуком. Если есть у кого желание поковыряться — велкам. У меня же время ограничено.

2. С этим всё просто.
Идём на сайт XDXF — XML Dictionary Exchange Format, скачиваем makedict-0.2beta1.tar.bz2, распаковываем, configure, make и в подкаталоге src получаем исполняемый файл makedict.
Предварительно потребуется установить компилятор gcc-c++ со всеми необходимыми зависимостями.

3. Конвертируем словари командой типа:

makedict -i dsl -o stardict LingvoUniversalER.dsl

На выходе получаем три файла:
LingvoUniversalER.dict — собственно, словарь.
LingvoUniversalER.idx — индекс.
LingvoUniversalER.ifo — описание.

Словарь можно сжать утилитой dictzip, чтобы уменьшить размер словаря. В результате получим файл с расширением .dict.dz.
Индекс тоже можно сжать обычным gzip‘ом.
Файл описания можно подредактировать на своё усмотрение, предварительно ознакомившись с форматом словарей stardict, дабы не наломать дров. Хотя полученный файл можно сразу смело использовать.
Все три файла кладутся в каталог /usr/share/stardict/dic

4. Запускаем stardict и вперёд :)
Если он был запущен, перезапустите его.

Вот, что получилось у меня:

jack@home: ~
13:42:08$ ls -lh /usr/share/stardict/dic
итого 49M
-rw-r--r-- 1 jack jack 821K Июн 29 03:28 AccountingER.dict.dz
-rw-r--r-- 1 jack jack  64K Июн 29 03:26 AccountingER.idx.gz
-rw-r--r-- 1 jack jack  368 Июн 29 03:28 AccountingER.ifo
-rw-r--r-- 1 jack jack 4,5M Май 25  2006 AmericanaER.dict.dz
-rw-r--r-- 1 jack jack 267K Май 25  2006 AmericanaER.idx.gz
-rw-r--r-- 1 jack jack  334 Май 25  2006 AmericanaER.ifo
-rw-r--r-- 1 jack jack 1,2M Май  7  2006 ComputersER.dict.dz
-rw-r--r-- 1 jack jack 132K Май  7  2006 ComputersER.idx.gz
-rw-r--r-- 1 jack jack  368 Май  7  2006 ComputersER.ifo
-rw-r--r-- 1 jack jack 454K Авг 29 20:49 EngineeringRE.dict.dz
-rw-r--r-- 1 jack jack 506K Авг 29 20:46 EngineeringRE.idx.gz
-rw-r--r-- 1 jack jack  364 Авг 29 20:50 EngineeringRE.ifo
-rw-r--r-- 1 jack jack 985K Июн 29 03:11 FinancialManagementER.dict.dz
-rw-r--r-- 1 jack jack  78K Июн 29 02:59 FinancialManagementER.idx.gz
-rw-r--r-- 1 jack jack  375 Июн 29 03:11 FinancialManagementER.ifo
-rw-r--r-- 1 jack jack 1,4M Июн 29 03:15 FinancialMarketsER.dict.dz
-rw-r--r-- 1 jack jack 125K Июн 29 03:00 FinancialMarketsER.idx.gz
-rw-r--r-- 1 jack jack  373 Июн 29 03:15 FinancialMarketsER.ifo
-rw-r--r-- 1 jack jack 922K Май  8  2006 LawER.dict.dz
-rw-r--r-- 1 jack jack 281K Май  8  2006 LawER.idx.gz
-rw-r--r-- 1 jack jack  331 Май  8  2006 LawER.ifo
-rw-r--r-- 1 jack jack 1,4M Май  7  2006 LingvoComputerER.dict.dz
-rw-r--r-- 1 jack jack 463K Май  7  2006 LingvoComputerER.idx.gz
-rw-r--r-- 1 jack jack  388 Май  7  2006 LingvoComputerER.ifo
-rw-r--r-- 1 jack jack 8,3M Май 23  2006 LingvoUniversalER.dict.dz
-rw-r--r-- 1 jack jack 908K Май 23  2006 LingvoUniversalER.idx.gz
-rw-r--r-- 1 jack jack  325 Май  7  2006 LingvoUniversalER.ifo
-rw-r--r-- 1 jack jack 2,4M Май  8  2006 LingvoUniversalRE.dict.dz
-rw-r--r-- 1 jack jack 850K Май  8  2006 LingvoUniversalRE.idx.gz
-rw-r--r-- 1 jack jack  324 Май  8  2006 LingvoUniversalRE.ifo
-rw-r--r-- 1 jack jack 1,5M Авг 29 20:48 ManagementER.dict.dz
-rw-r--r-- 1 jack jack 101K Июн 29 03:00 ManagementER.idx.gz
-rw-r--r-- 1 jack jack  379 Авг 30 13:16 ManagementER.ifo
-rw-r--r-- 1 jack jack 1,3M Июн 29 03:07 MarketingER.dict.dz
-rw-r--r-- 1 jack jack 123K Июн 29 03:00 MarketingER.idx.gz
-rw-r--r-- 1 jack jack  371 Июн 29 03:06 MarketingER.ifo
-rw-r--r-- 1 jack jack 1,3M Авг 30 13:22 OilAndGasER.dict.dz
-rw-r--r-- 1 jack jack 501K Авг 30 13:20 OilAndGasER.idx.gz
-rw-r--r-- 1 jack jack  329 Авг 30 13:21 OilAndGasER.ifo
-rw-r--r-- 1 jack jack 292K Май  8  2006 PatentsER.dict.dz
-rw-r--r-- 1 jack jack 120K Май  8  2006 PatentsER.idx.gz
-rw-r--r-- 1 jack jack  330 Май  8  2006 PatentsER.ifo
-rw-r--r-- 1 jack jack 4,2M Май  8  2006 PolytechnicalER.dict.dz
-rw-r--r-- 1 jack jack 1,8M Май  8  2006 PolytechnicalER.idx.gz
-rw-r--r-- 1 jack jack  344 Май  8  2006 PolytechnicalER.ifo
-rw-r--r-- 1 jack jack 1,3M Авг 22 17:59 PolytechnicalRE.dict.dz
-rw-r--r-- 1 jack jack 1,5M Авг 22 17:57 PolytechnicalRE.idx.gz
-rw-r--r-- 1 jack jack  357 Авг 22 17:59 PolytechnicalRE.ifo
-rw-r--r-- 1 jack jack 666K Май  8  2006 TelecomsER.dict.dz
-rw-r--r-- 1 jack jack 328K Май  8  2006 TelecomsER.idx.gz
-rw-r--r-- 1 jack jack  336 Май  8  2006 TelecomsER.ifo
-rw-r--r-- 1 jack jack 1,7M Авг 31 13:21 UniversalEU.dict.dz
-rw-r--r-- 1 jack jack 374K Авг 31 13:20 UniversalEU.idx.gz
-rw-r--r-- 1 jack jack  320 Авг 31 00:21 UniversalEU.ifo
-rw-r--r-- 1 jack jack 1,3M Авг 31 13:48 UniversalRU.dict.dz
-rw-r--r-- 1 jack jack 495K Авг 31 13:47 UniversalRU.idx.gz
-rw-r--r-- 1 jack jack  348 Авг 31 13:48 UniversalRU.ifo
-rw-r--r-- 1 jack jack 1,8M Авг 31 13:22 UniversalUE.dict.dz
-rw-r--r-- 1 jack jack 491K Авг 31 13:21 UniversalUE.idx.gz
-rw-r--r-- 1 jack jack  343 Авг 31 00:23 UniversalUE.ifo
-rw-r--r-- 1 jack jack 1,1M Авг 31 13:49 UniversalUR.dict.dz
-rw-r--r-- 1 jack jack 475K Авг 31 13:48 UniversalUR.idx.gz
-rw-r--r-- 1 jack jack  397 Авг 31 13:49 UniversalUR.ifo

Плюс скриншот главного окна:

Как видите есть проблемы с транскрипцией. После декомпиляции словарей даже в оригинальной кодировке UTF16 там всё равно такая вот каша. Как это побороть, я пока не знаю.

Updated: Согласно ЛОРу в новой версии xdxf это уже исправлено.

Заключение

В результате я наконец-то смог избавиться от работы с эмулятором, сэкономив дисковое пространство и повысив производительность своего труда засчёт отсутствия глюков Lingvo под CrossOver Office.

Данная статья не является идеальной. Многие вещи можно автоматизировать. Я привёл лишь общие направления для дальнейшей работы. Аналогичным образом можно выдрать словари из предыдущих версий Lingvo и использовать их в Linux в личных целях.

Убедительная просьба ко всем не распространять преобразованные таким образом словари в паблике. Нравится продукт — купите его, а уж потом делайте с ним, что позволит лицензия (хотя изменение нескольких байтов в компиляторе словарей всё же нарушает его; поверьте мне, я хорошо изучил лицензионное соглашение перед тем, как взялся за написание этой статьи).

Также не забываем, что ABBYY Lingvo претендует на звание не просто электронного словаря, а нечто большего (поиск по отдельным словам в предложении, система обучения, создание своих словарей и др.) Если вам нужны эти возможности, тогда по-прежнему используйте CrossOver Office Pro от компании CodeWeavers, последняя версия которого (5.0.1) хорошо зарекомендовала себя в плане работы с Lingvo. Описание установки Lingvo 11 в CrossOver Office смотрите в моей второй статье.

Кроме того с выходом Lingvo 11ML появилась возможность не патчить главный файл, а просто активировать программу с помощью удобного активатора, посвящённого тормозам из SSG… :)
В случае приобретения лицензионной версии продукта для достижения относительно нормальной его работы в эмуляторе под линухом вам скорее всего придётся прибегнуть к одному из этих способов. Боюсь, что официальные способы активации могут не сработать.

Как всегда спасибо рубордовскому форуму за предоставленные байтики :)
А также компании «Русский щит» за хороший промоушн продуктов АБИ.

Оставите комментарий ?

39 Комментарии。

  1. Скриптик для автоматизации:-)

    [code]
    #!/bin/bash
    PATH_DSL=$1
    mkdir ./stardict
    mkdir -p ./tmp/tmp
    cp $1/*.ann ./tmp
    for i in $(ls $PATH_DSL | grep dsl); do \
    iconv -f utf16 -t utf8 $PATH_DSL/$i | sed -r ‘s/\[s\].+\.wav\[\/s\]//’ >./tmp/$i.utf8 && \
    iconv -f utf8 -t utf16 ./tmp/$i.utf8 > ./tmp/$i && \
    rm -f ./tmp/$i.utf8 && \
    makedict -i dsl -o stardict ./tmp/$i -d ./tmp/tmp; done
    find ./tmp/tmp -iname «*.*» \! -type d -exec mv \{\} ./stardict/ \;
    for i in $(ls ./stardict | grep dict$); do dictzip ./stardict/$i; done
    for i in $(ls ./stardict | grep idx$); do gzip -9 ./stardict/$i; done
    rm -R ./tmp
    echo «Done»

    P.S. И спасибо за статью.
    [/code]

  2. Hi Jack,

    I am relatively new in Linux, right now I’m using Ubuntu 7.04 and I still need to learn lots. I really need to decompile the Lingvo dictionaries. I have Lingvo 12 ML, and there the Dslcomp.exe seems to be different from the one from 11 version :-(

    Cause when I open is in mc and follow your instructions, the data are different. For example only 2 numbers correspond to the address you give. May be I do smth wrong? Search on ru.board didn’t help either, I might be inattentive though. Please help me, I really need those dsl’s.

    Best Regards, Katya

  3. Большое спасибо, Acid Jack
    У меня 12-й лингво. К сожалению, файл Dslcomp немного отличается от того, который описан на форуме (12 версии). Может быть вы можете его посмотреть или дать ссылочку на рабочий dslcomp.exe?

  4. не, чувак, ищи сам
    я не гугл

  5. А причём тут, собственно, гугл? :-)
    Dslcomp у меня (лицензионный) есть. Но он слегка отличается от тех, которые описаны в статье и на форуме.
    Просто если вы поясните в чём суть патча или поделитесь своей версией 12-го dslcomp, то я смогу решить проблему, думаю.

  6. А мне вот понадобилось «перепаковать» словари от 12-й версии. Что забавно — честно купленной, вот только рабочее место там под линуксом.
    Под WINE не работают ни словарь, ни компилятор (патченый компилятор, к слову, нашёлся). В итоге пришлось городить дурацкий огород с временной установкой вин2000 под VirtualBox для декомпиляции словарей…

    Впрочем, дальше всё легко. Разве что StarDict удивил — разве сложно было организовать подключение пользовательских словарей в юзерленде? Или я чего-то не понял, или это задача «root only».

  7. 2zmeuka:
    Можно положить словарики в ~/.stardict/dic/

  8. У меня указанное выше регулярное выражение не дало эффекта.
    Думается, что оно должно выглядеть так:
    sed -r \’s/\\[s\\].+\\.wav\\[\\/s\\]//\’

  9. Sorry, почему то лишние бэкслэши вставились :-)
    [CODE] sed -r ‘s/\[s\].+\.wav\[\/s\]//’ [/CODE]

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>