Перенос словарей из 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 и ниже будет описана работа именно с ней).
Общая схема довольно проста:
- конвертируем lsd в dsl (dslcomp.exe)
- собираем makedict (make)
- преобразовываем словари из формата dsl в формат stardict (makedict)
- пользуемся :)
В каждом из пунктов есть свою нюансы, о которых будет рассказано ниже.
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... :)
В случае приобретения лицензионной версии продукта для достижения относительно нормальной его работы в эмуляторе под линухом вам скорее всего придётся прибегнуть к одному из этих способов. Боюсь, что официальные способы активации могут не сработать.
Как всегда спасибо рубордовскому форуму за предоставленные байтики :)
А также компании "Русский щит" за хороший промоушн продуктов АБИ.
Обратных ссылок ещё нет.
10 марта 2007 - 12:01
Скриптик для автоматизации:-)
[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]
18 июля 2007 - 16:55
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
18 июля 2007 - 22:15
2 Katya: look here
17 августа 2007 - 16:32
Большое спасибо, Acid Jack
У меня 12-й лингво. К сожалению, файл Dslcomp немного отличается от того, который описан на форуме (12 версии). Может быть вы можете его посмотреть или дать ссылочку на рабочий dslcomp.exe?
17 августа 2007 - 16:41
не, чувак, ищи сам
я не гугл
17 августа 2007 - 20:42
А причём тут, собственно, гугл? :-)
Dslcomp у меня (лицензионный) есть. Но он слегка отличается от тех, которые описаны в статье и на форуме.
Просто если вы поясните в чём суть патча или поделитесь своей версией 12-го dslcomp, то я смогу решить проблему, думаю.
18 августа 2007 - 03:06
А мне вот понадобилось «перепаковать» словари от 12-й версии. Что забавно – честно купленной, вот только рабочее место там под линуксом.
Под WINE не работают ни словарь, ни компилятор (патченый компилятор, к слову, нашёлся). В итоге пришлось городить дурацкий огород с временной установкой вин2000 под VirtualBox для декомпиляции словарей…
Впрочем, дальше всё легко. Разве что StarDict удивил – разве сложно было организовать подключение пользовательских словарей в юзерленде? Или я чего-то не понял, или это задача «root only».
20 августа 2007 - 10:20
2zmeuka:
Можно положить словарики в ~/.stardict/dic/
27 сентября 2007 - 16:28
У меня указанное выше регулярное выражение не дало эффекта.
Думается, что оно должно выглядеть так:
sed -r \’s/\\[s\\].+\\.wav\\[\\/s\\]//\’
27 сентября 2007 - 16:31
Sorry, почему то лишние бэкслэши вставились :-)
[CODE] sed -r ‘s/\[s\].+\.wav\[\/s\]//’ [/CODE]