Возьмем к примеру класс http://crossplatform.ru/documentation/qtdoc4.3/qstring.php, по идее основная масса исправлений приходится на описание функций.
Возникает вопрос, какой алгоритм однозначно без ошибок поменяет английское описание на русское, когда есть и то и то, но русское немного устаревшее, вроде того, что меньше функций. Или добавлено совсем чуть-чуть дополнительного текста.
Разметка примерно такая:
Английский вариант
<h3 class="fn"><a name="QString"></a>QString::QString ()</h3>
<p>Constructs a null string. Null strings are also empty.</p>
<p>See also <a href="qstring.php#isEmpty">isEmpty</a>().</p>
<h3 class="fn"><a name="QString-2"></a>QString::QString ( const <a href="qchar.php">QChar</a> * <i>unicode</i>, int <i>size</i> )</h3>
<p>Constructs a string initialized with the first <i>size</i> characters of the <a href="qchar.php">QChar</a> array <i>unicode</i>.</p>
<p><a href="qstring.php">QString</a> makes a deep copy of the string data.</p>
<h3 class="fn"><a name="QString-3"></a>QString::QString ( <a href="qchar.php">QChar</a> <i>ch</i> )</h3>
<p>Constructs a string of size 1 containing the character <i>ch</i>.</p>
<h3 class="fn"><a name="QString"></a>QString::QString ()</h3>
<p>Создает нулевую строку. Нулевая строка всегда пустая.</p>
<p>См. также <a href="qstring.php#isEmpty">isEmpty</a>().</p>
<h3 class="fn"><a name="QString-2"></a>QString::QString ( const <a href="qchar.php">QChar</a> * <i>unicode</i>, int <i>size</i> )</h3>
<p>Создает строку инициализированную первыми <i>size</i> символов массива <a href="qchar.php">QChar</a> <i>unicode</i>.</p>
<p><a href="qstring.html">QString</a> производит глубокое копирование информации строки.</p>
<h3 class="fn"><a name="QString-3"></a>QString::QString ( <a href="qchar.php">QChar</a> <i>ch</i> )</h3>
<p>Создает строку длиной 1 содержащую символ <i>ch</i>.</p>
Как вариант, можно взять старые английскую версию и русскую версии, распарсить их по тегам, и вогнать в QMap<QString, QString>.
Ключем будет английский вариант, а значением русский.
После чего читаем новую версию, парсим на лету и сравниваем с ключами в QMap, если совпадает, то английскую строку на русскую.
Это как вариант, но хотелось бы еще рассматреть какие-нибудь варианты.
Я бы нарисовал на python-е.
Документы разбираются например http://www.crummy.com/software/BeautifulSoup/documentation.html, потом идёшь по деревам параллельно и перекидываешь строки из русского в английское. Как маркеры синхронизации использовать текст в тагах <h3 class="fn"> и аналогичных.
Оставь ссылку на несколько русских файлов - на выходных помучаю.
http://crossplatform.ru/uploads/qtdocs.rar.
Но вся проблема в том, что как я посмотрел, например в том же QString в Qt 4.3.2 по сравнению с 4.1.0 описание явно отличается, явно изменилось описание, вместо последовательного разбито на части, некоторые строки вообще убраны, ну и конечно же добавлено много функций.
Поэтому я думаю, что обычными маркерами не отделаться...
[OFFTOP]
Тема еще пока актуальна!
На даный момент бодаюсь с обработкой регулярными выражениями, и при сдвиге в форматитировании немного в сторону результат получается не тот, что ожидался, может быть это и из-за того, что я плохо знаю регулярные выражения.
Не надо регекспы. Там все файлы в формате xhtml - нормально парсяться любым xml парсером.
Все описания функции/свойства находяться на одном уровне.
Всегда начинаются с тага <h3 class="fn">
его первый ребёнок - пустой якорь, например <a name="checkable-prop"></a>
Дальше идём по братьям до следующего подобного <h3 class="fn">, или до пустого <p />, за которым сразу <address>.
Вот код на python для выдёргивания:
from BeautifulSoup import BeautifulStoneSoup, Tag
def get_soup(f_name):
content = file(f_name).read().replace(
'<?xml version="1.0" encoding="iso-8859-1"?>',
'<?xml version="1.0" encoding="windows-1251"?>', 1)
return BeautifulStoneSoup(content)
def get_all_func(soup):
def is_func(tag):
return (
isinstance(tag, Tag) and tag.name == 'h3' and
dict(tag.attrs).get('class') == 'fn')
def is_stop(tag):
if not (isinstance(tag, Tag) and tag.name == 'p'):
return False
child = tag.contents[0]
return isinstance(child, Tag) and child.name == 'address'
funcs = []
for tag in soup.findAll('h3', **{'class': 'fn'}):
tags = [tag]
funcs.append((tag.a['name'], tags))
tag = tag.nextSibling
while tag and not (is_func(tag) or is_stop(tag)):
tags.append(tag)
tag = tag.nextSibling
return funcs
def test()
funcs = get_all_func(get_soup(r'4.1.0\qabstractbutton.html'))
for func in funcs:
print '@', func[0]
for dscr in func[1]:
print dscr
test()
Я как не програмер, имею в голове такую схему:
Есть английская версия EN-1,
Есть её русский перевод RU-1,
Есть свежая английская версия EN-2,
Делаем из EN-1 и RU-1 получаем Diff-1,
Делаем из EN-1 и EN-2 получаем Diff-2,
Diff-x делается стандартными средствами UNIX'ов или подобными.
теперь как-то патчим RU-1 с помощью Diff-2 чтобы получить RU-2, бестолково конечно, но, вдруг, кто нибудь из програмеров найдет в этом изюминку.
зачем велосипеды?
ваша задача - распарсить html-страницы с чёткой структурой в формат gettext po, а затем передать работу средствам используемым для переводов программ и документации, в т.ч. KDE
пример распарсенного XML docbook:
http://websvn.kde.org/*checkout*/trunk/l10n-kde4/ru/docmessages/kdepim/kmail_using-kmail.po
http://websvn.kde.org/*checkout*/trunk/KDE/kdepim/doc/kmail/using-kmail.docbook
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)