Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: kuzulis от Июнь 15, 2009, 14:54



Название: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 15, 2009, 14:54
Доброго времени суток...

Я решил тут собрать приложение с использованием статической библитеки. В этой библиотеке я некоторые строки писал через tr...

Сделал всё как надо, т.е:

1. Создал в library.pro
Код:
...
RESOURCES += resources.qrc
TRANSLATIONS += translations/qserialdevice_ru.ts
...

2. Создал сам файл resources.qrc
Код:
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/translations">
<file>translations/qserialdevice_ru_RU.qm</file>
</qresource>
</RCC>

3. сгенерировал файлы *.ts и *.qm
4. собрал саму эту библиотеку
Цитировать
    qmake library.pro
    make
5. появился файл library.a  .. вроде тут все понятно...

теперь, подключаю её в мое приложение:
1. В файл проекта app.pro как надо подключаю её и т.п.
2. В main.cpp транслятор гружу так:
Код:
....
QString locale = QLocale::system().name();
qDebug() << locale;

QTranslator translator;
if (!translator.load( ":/translations/qserialdevice_"+locale+".qm" ))
qDebug() << "Load translator fail";
app.installTranslator(&translator);
....
3. Собираю приложение - ошибок нет..
4. Запускаю приложение - НО в консоли моя дебажка выводит :  "Load translator fail" т.е. функция возвращает false!

Я уже пробовал и так и сяк: и менял *_ru.qm, и *_ru_RU.qm и в файле *.qrc убирал префиксы и т.п. - НО грузить из ресурсов не хочет!

Поэтому:

1. Как все-таки это сделать?
2. Как узнать, прицепились ли ресурсы к библиотеке при её компиляции?

ЗЫ: QT 4.1.1  :)



Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 15, 2009, 15:25
хм... пробовал комментировать в файле Library.pro при сборке библиотеки :
Код:
#RESOURCES		+= resources.qrc
#TRANSLATIONS += translations/qserialdevice_ru.ts

и потом убирать комментарий и опять собирать библиотеку  - и получается, что размер моей библиотеки что так, что эдак получается одинаковый.. т.е получается что ресурсы не вкомпиливаются в неё!! :(


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: ритт от Июнь 15, 2009, 15:28
бгг...всё вкомпиливается - просто надо пересобирать начисто...
а по теме:

Цитировать
-    if (!translator.load( ":/translations/qserialdevice_"+locale+".qm" ))
+    if (!translator.load( ":/translations/translations/qserialdevice_"+locale+".qm" ))


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 15, 2009, 15:43
НЕ работает!

Цитировать
бгг...всё вкомпиливается - просто надо пересобирать начисто...
Ёпт! Я так и делаю


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: ритт от Июнь 15, 2009, 17:24
Q_INIT_RESOURCE ?


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 15, 2009, 18:27
Цитировать
Q_INIT_RESOURCE ?

я не понял как этот макрос применить в моем случае... т.к. нужно :
1. вызывать эту ф-ю (макрос или чо там) из main
2. в качестве параметра указывать имя файла *.qrc - а в моем случае это файл resources.qrc который находится в директории БИБЛИОТЕКИ а не самого приложения...

и если я добавляю в приложение ( в main.cpp) :
Код:
...
    Q_INIT_RESOURCE(resources);
...
то при компиляции вываливаются сообщения:
Цитировать
[den@myhost default]$ make
g++ -c -pipe -march=x86-64 -mtune=generic -O2 -pipe -D_REENTRANT -Wall -W -DQT_NO_DEBUG -DQT_CORE_LIB -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include -I../../src -Ibuild/moc -o build/obj/main.o main.cpp
g++ -Wl,-rpath,/usr/lib -o release/default build/obj/main.o    -L../../src/release -L/usr/lib -lqserialdevice -lQtCore -lpthread
build/obj/main.o: In function `main':
main.cpp:(.text+0x19): undefined reference to `qInitResources_resources()'
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [release/default] Ошибка 1
[den@myhost default]$



Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 15, 2009, 19:00
Даже не работает приложение , которое я прицепил в аттаче!! :( Что я делаю не так?


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 15, 2009, 21:10
Блина, работает только если принудительно указывать имя файла перевода!
Код:
...
QString str = QDir::currentPath() + "/translations/hello_Russian.qm";
qDebug() << str;
if (!translator->load(str))
...

Иначе никак не хочет! Как скомпилировать приложение чтобы ресурсы с исполняемым файлом объединились?  Я уже злоййй!!!  Бьюсь об стену - и она не выдердживает!! :(


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: BRE от Июнь 15, 2009, 21:42
Иначе никак не хочет! Как скомпилировать приложение чтобы ресурсы с исполняемым файлом объединились?  Я уже злоййй!!!  Бьюсь об стену - и она не выдердживает!! :(
Спокойней, удары об стену никому на пользу не идут.  :)

В main.cpp добавляй:
Код
C++ (Qt)
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE( resources );
       ...
 

В hello.pro:
CONFIG          = release warn_on qt console
меняем на это
CONFIG         += release warn_on qt console

и все будет Ok.  ;)


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 16, 2009, 07:53
2 BRE,

Спасибо, никогда бы не додумался о правке *.pro :)

Но теперь вместо слова : "Привет" выводится (под Windows XP) :
Цитировать
....
C:\Temp\hello>release\hello.exe
"ru_RU"
"╧ЁштхЄ"
^C
C:\Temp\hello>
....

Эту крякозяблу как победить? :)


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 16, 2009, 09:17
пробовал в main.cpp писать:
Код:
...
Q_INIT_RESOURCE(resources);
        QCoreApplication app(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1250"));
...

и вместо Windows-1250 писал и Windows-1251 и UTF-8 - но ничего не изменилось.. как выводился крякомусор так и выводится :(


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: BRE от Июнь 16, 2009, 09:22
и вместо Windows-1250 писал и Windows-1251 и UTF-8 - но ничего не изменилось.. как выводился крякомусор так и выводится :(
По венде я не советчик, но на сколько я помню, у нее в консоли 866 кодировка.  :)


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 16, 2009, 09:55
Ёптель! :)

Наконец то заработало!

У меня заработало, если написать так:
Код:
...
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
...

!!!



Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: spirit от Июнь 16, 2009, 12:03
а CP-866 разве не пашет?


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 16, 2009, 12:42
Дык в ассистенте (у меня) написано только это:
Цитировать
The supported encodings are:
Apple Roman
Big5
Big5-HKSCS
EUC-JP
EUC-KR
GB18030-0
IBM 850
IBM 866
IBM 874
ISO 2022-JP
ISO 8859-1 to 10
ISO 8859-13 to 16
Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
JIS X 0201
JIS X 0208
KOI8-R
KOI8-U
MuleLao-1
ROMAN8
Shift-JIS
TIS-620
TSCII
UTF-8
UTF-16
UTF-16BE
UTF-16LE
Windows-1250 to 1258
WINSAMI2

и тут нету cp866 :)


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: ритт от Июнь 18, 2009, 08:06
хм, а ведь я порой даю дельные советы :)
/* что ж меня с первого раза-то никто не слышит? ( */


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 18, 2009, 09:28
2 Константин ,

спасибо канечно, но в данном случае все дело было в том, что в конфиге нужно писать += вместо = :) ...  вот мне интересно.. почему происходит такая путаница с этим?

нигде в литературе не встречал чтобы была разница как писать:

CONFIG          = release warn_on qt console
или
CONFIG         += release warn_on qt console

или

QT += network xml
или
QT = network xml

т.е не описаны нюансы .... и в зависимости от этого уже и по-разному компилятор компилит код! :)

т.е. если использовать +=  - то qmake создаст Makefile.debug и создаст директорию Debug!!! o_O Почему так происходит - я так и не понял.. ведь нигде в строке нет упоминания о debug !!

ЗЫ: но это наверное тема другого топика!


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: ритт от Июнь 18, 2009, 09:38
изначально было очевидно, что подставляется неверный путь;
затем неочевидное - использование макроса Q_INIT_RESOURCE при статической линковке.

а про
Цитировать
CONFIG          = release warn_on qt console
или
CONFIG         += release warn_on qt console
- всё так же просто, как и для
Цитировать
QString CONFIG("kill'em all ");
CONFIG          = release warn_on qt console
или
CONFIG         += release warn_on qt console


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: spirit от Июнь 18, 2009, 09:38
а что будет, если ты напишешь
Код:
QString str = "hello";
str += "world";
и
Код:
QString str = "hello";
str = "world";
?

аналогично и с про-файлом.


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: spirit от Июнь 18, 2009, 09:39
нэуспэл   :)


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 18, 2009, 09:44
Ёлки! Но в документации по QT4 ( в Ассистенте) не сказано, что включено в CONFIG по умолчанию!!!!

т.е подразумевалось (мною) что изначально CONFIG пуст!!!!

в отличие скажем от QT -  для которой в документации сказано что включено по умолчанию - а что нет.



Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 18, 2009, 09:47
и мне интересно.. какие вообще у ключа CONFIG по умолчанию включены опции??!!


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: spirit от Июнь 18, 2009, 09:47
не нервничай. напиши в про-файле
Цитировать
message($$CONFIG)
и увидешь, что в конфиге.


Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: kuzulis от Июнь 18, 2009, 09:59
2 spirit,

спасибо!

получилось вот что:
Цитировать
Project MESSAGE: lex yacc warn_on debug uic resources rtti_off exceptions_off stl_off incremental_of
f thread_off windows release ReleaseBuild Release build_pass qt warn_on release link_prl copy_dir_fi
les debug_and_release debug_and_release_target precompile_header release shared stl exceptions rtti
release ReleaseBuild Release build_pass

а как бы теперь узнать про опции :

lex
yacc
uic
resources

и т.п ???

просто хочется по возможности при сборке проекта выкинуть все "ненужные" опции , чтобы максимально уменьщить и облегчить его! :)



Название: Re: статическая библиотека и транслятор. Не работает!
Отправлено: ритт от Июнь 18, 2009, 10:16
раз они (опции) там есть по умолчанию, предполагается, что они все нужные...
зачем себе на хвост наступать?