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… :)
В случае приобретения лицензионной версии продукта для достижения относительно нормальной его работы в эмуляторе под линухом вам скорее всего придётся прибегнуть к одному из этих способов. Боюсь, что официальные способы активации могут не сработать.

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