LINUX.ORG.RU

телепаты уже спят

QTextCodec *tc = QTextCodec::codecForName("utf8");
QTextCodec::setCodecForCStrings(tc);

или хотя бы объясни, откуда ты её туда выводишь…

arsi ★★★★★
()
Ответ на: комментарий от flareguner
QString Googletranslate::translate(const QString &text, const QString &from,
				   const QString &to)
{
    const QString detected_lang = detectLanguage(text);
    QString curent_src_lang;
    if(m_auto_detect && !detected_lang.isEmpty())
	curent_src_lang = detected_lang;
    else
	curent_src_lang = from;

    const QString url("http://ajax.googleapis.com/ajax/services/language/translate");

    const QString request = QString("v=%1&langpair=%2&q=%3").
			    arg("1.0").
			    arg(curent_src_lang + '|' + to).
			    arg(text.toUtf8().toPercentEncoding().data());
#ifdef QGT_DEBUG
    qDebug() << "Source text (formed): " << request;
#endif
    QNetworkAccessManager manager;
    QEventLoop loop;

    connect(&manager, SIGNAL(finished(QNetworkReply*)),
            &loop, SLOT(quit()));

    QNetworkReply *reply = manager.post(QNetworkRequest(url), request.toUtf8());
    loop.exec();

    const QByteArray rawdata = reply->readAll();

#ifdef QGT_DEBUG
    qDebug() << rawdata;
#endif
    QxtJSON parser;

    const QString result = jsonExtract(rawdata, "responseData",
				       "translatedText");


#ifdef QGT_DEBUG
    qDebug() << Q_FUNC_INFO << result;
#endif

    if(result.isEmpty())
        return QString();


    QTextCodec *tc = QTextCodec::codecForName("utf8");
    QTextCodec::setCodecForCStrings(tc);

//    return result;
    return QTextDocumentFragment::fromHtml(result).toPlainText();
flareguner
() автор топика
Ответ на: комментарий от arsi

Текст берется из QTextEdit. Как узнать там кодировку?

flareguner
() автор топика
Ответ на: комментарий от arsi

или, как вариант, поставьте

QTextCodec *tc = QTextCodec::codecForName("utf8");
QTextCodec::setCodecForCStrings(tc);

перед(!)

const QString result = jsonExtract(rawdata, "responseData",
                   "translatedText");
arsi ★★★★★
()
Ответ на: комментарий от flareguner

> It works!

o_O

неожиданно…

ну ладно, бывает ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

Хм... возникла проблема. Некоторые символы криво декодироваться стали. Например I'm -> I#39;m. Это раньше лечилось QTextDocumentFragment::fromHtml(result).toPlainText();

flareguner
() автор топика
Ответ на: комментарий от flareguner

> Хм... возникла проблема.

а, тогда всё нормально ;)

вместо того, что я предложил раньше, попробуйте

QTextDocumentFragment::fromHtml(QString::fromUtf8(result.toLatin1().data())).toPlainText();

или

QString::fromUtf8(QTextDocumentFragment::fromHtml(result).toPlainText().toLatin1().data());
arsi ★★★★★
()
Ответ на: комментарий от flareguner

э… не понял. после «rawdata» всё остальное вроде как QString, в т.ч. и возвращаемый тип… или я что-то проглядел?

arsi ★★★★★
()
Ответ на: комментарий от flareguner

оставьте всё так, как было в этом посте. только

    QTextCodec *tc = QTextCodec::codecForName("utf8");
    QTextCodec::setCodecForCStrings(tc);
уберите к лешему.

и потом пробуйте эти варианты (которые в return …).

arsi ★★★★★
()
Ответ на: комментарий от arsi

Не помогло. Так и остались эти баги с кавычками.

flareguner
() автор топика
Ответ на: комментарий от arsi

Вот код

QString Googletranslate::translate(const QString &text, const QString &from,
				   const QString &to)
{
    const QString detected_lang = detectLanguage(text);
    QString curent_src_lang;
    if(m_auto_detect && !detected_lang.isEmpty())
	curent_src_lang = detected_lang;
    else
	curent_src_lang = from;

    const QString url("http://ajax.googleapis.com/ajax/services/language/translate");

    const QString request = QString("v=%1&langpair=%2&q=%3").
			    arg("1.0").
			    arg(curent_src_lang + '|' + to).
			    arg(text.toUtf8().toPercentEncoding().data());
#ifdef QGT_DEBUG
    qDebug() << "Source text (formed): " << request;
#endif
    QNetworkAccessManager manager;
    QEventLoop loop;

    connect(&manager, SIGNAL(finished(QNetworkReply*)),
            &loop, SLOT(quit()));

    QNetworkReply *reply = manager.post(QNetworkRequest(url), request.toUtf8());
    loop.exec();

    const QByteArray rawdata = reply->readAll();

#ifdef QGT_DEBUG
    qDebug() << rawdata;
#endif
    QxtJSON parser;

//    QVariantMap map = parser.parse(rawdata.data()).toMap();
//    QVariantMap map2 = map["responseData"].toMap();

    const QString result = jsonExtract(rawdata, "responseData",
				       "translatedText");


#ifdef QGT_DEBUG
    qDebug() << Q_FUNC_INFO << result;
#endif

    if(result.isEmpty())
        return QString();


//    QTextCodec *tc = QTextCodec::codecForName("utf8");
//    QTextCodec::setCodecForCStrings(tc);
//QTextDocumentFragment::fromHtml(QString::fromUtf8(result.toLatin1().data())).toPlainText();
//    return result;
    return QString::fromUtf8(QTextDocumentFragment::fromHtml(result).toPlainText().toLatin1().data()).simplified();
}

flareguner
() автор топика
Ответ на: комментарий от flareguner

у меня к вам три вопроса: :)

1) зачем «QxtJSON parser;»? (не используется вроде…)

2) что такое jsonExtract()? а то гугль ведёт только на лор и на…

3) при чём тут http://code.google.com/p/qgt/ ? :)

я о чём… если есть возможность получить исходник проекта и локально с него «поиздеваться», то это гораздо эффективнее, чем тыкать пальцем в небо и играть в дистанционно управляемого программиста ;)

arsi ★★★★★
()
Ответ на: комментарий от flareguner
$ svn checkout http://qgt.googlecode.com/svn/trunk/ qgt
...
Checked out revision 77.
$ cd qgt
$ qmake
WARNING: Failure to find: src/translator.cpp
WARNING: Failure to find: src/3rdparty/dsingleapplication.cpp
WARNING: Failure to find: src/plugins/engine/google_translate/googletranslate.cpp
WARNING: Failure to find: src/plugins/engine/enginefactory.cpp
WARNING: Failure to find: src/defines.h
WARNING: Failure to find: src/translator.h
WARNING: Failure to find: src/3rdparty/dsingleapplication.h
WARNING: Failure to find: src/plugins/engine/engineinterface.h
WARNING: Failure to find: src/plugins/engine/google_translate/googletranslate.h
WARNING: Failure to find: src/plugins/engine/enginefactory.h
WARNING: Failure to find: src/common/defines.h
WARNING: Failure to find: src/plugins/engine/google_translate/resources.qrc
/usr/lib64/qt/bin/rcc: File does not exist 'src/plugins/engine/google_translate/resources.qrc'

эм… есть смысл набирать «make»?)

arsi ★★★★★
()
Ответ на: комментарий от flareguner

ненавижу cmake… >_<'

как заставить собирать с «-fPIC»? (и почему он сам этого не делает?) какой аналог «make distclean»? боюсь, у меня больше времени уйдёт на борьбу с этим лисапедом, чем на решение проблемы :( может, кто другой поможет…

arsi ★★★★★
()
Ответ на: комментарий от arsi

Хм.... не знаю. CMake кажется удобным. А я думаю, что вам достаточно класс только глянуть этот, чтобы понять. Там все довольно очевидно.

flareguner
() автор топика
Ответ на: комментарий от flareguner

QxtJSON parser; - это кусок старого кода там забыл я, теперь парсинг происходит в qjsonExtract

flareguner
() автор топика
Ответ на: комментарий от flareguner

глянуть — одно, а вот проверить/продебажить — совсем другое, тут без рабочего проекта ну никак. завтра, на свежую голову, погуглю опции цмейка и попробую таки собрать. стандартные из слакбилдов что-то не подходят…

arsi ★★★★★
()
Ответ на: комментарий от arsi

Не думал вот, что в смейке такие грабли... Ну что же, спасибо за то, что пытаетесь помочь. Надеюсь завтра решим этот вопрос.

flareguner
() автор топика
Ответ на: комментарий от flareguner
Parse error in command line argument: -DfPIC
Should be: VAR:type=value
arsi ★★★★★
()
Ответ на: комментарий от flareguner
Parse error in command line argument: -DBUILD64BIT
Should be: VAR:type=value

без них всё заканчивается «стандартно»:

../../3rdparty/qxtjson/libqxtjson.a(qxtjson.cpp.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

arsi ★★★★★
()
Ответ на: комментарий от flareguner

значит так =)

там QxtJSON кривой как наши дороги =) в эскейп-последовательности \uXXXX эти XXXX читаются как десятичное число %)

«поправил», вроде теперь корректно работает:

$ svn diff src/3rdparty/qxtjson/qxtjson.cpp

Index: src/3rdparty/qxtjson/qxtjson.cpp
===================================================================
--- src/3rdparty/qxtjson/qxtjson.cpp    (revision 79)
+++ src/3rdparty/qxtjson/qxtjson.cpp    (working copy)
@@ -251,9 +251,7 @@
             }else if(c=='f'){
                 str.append('\f');
             }else if(c=='u'){
-                short u;
-                s>>u;
-                str.append(QChar(u));
+                str.append(QChar(s.read(4).toUShort(0, 16)));
             }else{
                 str.append(c);
             }

arsi ★★★★★
()
Ответ на: комментарий от flareguner

незачто)

кстати, раз такая пьянка…

$ svn diff src/plugins/google_translate/googletranslate.cpp

Index: src/plugins/google_translate/googletranslate.cpp
===================================================================
--- src/plugins/google_translate/googletranslate.cpp    (revision 79)
+++ src/plugins/google_translate/googletranslate.cpp    (working copy)
@@ -128,8 +128,8 @@
 //    QVariantMap map = parser.parse(rawdata.data()).toMap();
 //    QVariantMap map2 = map["responseData"].toMap();
 
-    const QString result = jsonExtract(rawdata, "responseData",
-                                      "translatedText");
+    const QString result = jsonExtract(QString::fromUtf8(rawdata.data()),
+                                       "responseData", "translatedText");
 
 
 #ifdef QGT_DEBUG
@@ -139,12 +139,7 @@
     if(result.isEmpty())
         return QString();
 
-
-//    QTextCodec *tc = QTextCodec::codecForName("utf8");
-//    QTextCodec::setCodecForCStrings(tc);
-//QTextDocumentFragment::fromHtml(QString::fromUtf8(result.toLatin1().data())).toPlainText();
-//    return result;
-    return QString::fromUtf8(QTextDocumentFragment::fromHtml(result).toPlainText().toLatin1().data()).simplified();
+    return QTextDocumentFragment::fromHtml(result).toPlainText().simplified();
 }
 
 QString Googletranslate::getPluginVersion() const

arsi ★★★★★
()
Ответ на: комментарий от flareguner

да, чуть не забыл:

$ svn diff CMakeLists.txt 

Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt      (revision 79)
+++ CMakeLists.txt      (working copy)
@@ -3,6 +3,10 @@
 
 SET (CMAKE_BUILD_TYPE Debug)
 
+IF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
+  SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
+ENDIF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
+
 ADD_DEFINITIONS(${QT_DEFINITIONS})
 ADD_DEFINITIONS(-DQT_NETWORK)
 #ADD_DEFINITIONS(-DQT_TEST)

но это не совсем корректно, под виндой 64-битной с MSVC не соберётся. здесь лучше делать проверку на компилятор, но я хз как)

arsi ★★★★★
()
Ответ на: комментарий от arsi

Потом подумаю, как это лучше сделать. Хотя оно в принципе на MSVC не рассчитано, а на стандарнтый Mingw

flareguner
() автор топика
Ответ на: комментарий от flareguner

> Где вы откопали suncc?

дык, он раньше был в свободном доступе (только «анкету» заполнить надо было), как часть SUN Studio 12.1 (для х86 был только 32-битный, но он мог собирать и под х86_64; оптимизация местами круче gcc). не так давно, после покупки сана ораклом, на почту пришло уведомление о выходе какого-то Solaris Studio 12.2. возможно, это одно и то же, но слово «Solaris» что-то не внушает доверия… не качал, не знаю, тогда времени не было, а потом просто забыл… надо будет разведать ситуацию, хотя бы просто ради интереса…

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.