Russian Qt Forum

Qt => Вопросы новичков => Тема начата: UndeadDragon от Ноябрь 02, 2012, 19:49



Название: Перевод при помощи tr() [РЕШЕНО]
Отправлено: UndeadDragon от Ноябрь 02, 2012, 19:49
Всем привет. Пытаюсь сделать в приложении динамическую смену языков. Сделал все в соответствии с мануалом, перевел все тексты при помощи Qt Linguist, скомпилировал в .qm, добавил в ресурсы.
Попробовал протестировать и перевод не заработал. Сменились тексты только в тех местах, за которые отвечает функция retranslateUi() сгенерированная uic'ом.
Код:
ApproximateView::ApproximateView(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
transIt = new QTranslator(this);
qApp->installTranslator(transIt);
QTranslator qtTranslator;
    qtTranslator.load("qt_" + QLocale::system().name());
    qApp->installTranslator(&qtTranslator);

....
QDir resors(":/langs");
QStringList filters;
filters<<"*.qm";
langsList = resors.entryList(filters);

for(int i = 0; i < langsList.size(); i++){

langs.push_back(new QAction(QString(langsList[i]).remove(".qm"),this));
connect(langs[i],SIGNAL(triggered()),this,SLOT(changeLang()));
langs[i]->setCheckable(true);

}

lang->addActions(langs);
}
Когда пользователь меняет язык, программа запускает слот, который определяет какой язык был выбран и выполняет необходимые действия:
Код:
void ApproximateView::changeLang(){

QAction *act = qobject_cast<QAction*>(sender());

int whoSend;

for(int i = 0; i < langsList.size(); i++){
if(act != langs[i])
langs[i]->setChecked(false);
else
whoSend = i;
}


transIt->load(QString(":/langs/%1").arg(langsList[whoSend]));

//Далее тестовые момент. Последняя строка перевод производит (форма сгенерированная uic)
//Все остальное никак на перевод не реагирует и оставляет все таким же.
enterAdmin->setText(tr("Войти в систему"));
help->setText(tr("Помощь"));
showFacts->setText("Ололо");
tables->retranslateUi(tables);
}
Помогите, пожалуйста, а то запарился. Заранее всем спасибо :)


Название: Re: Перевод при помощи tr()
Отправлено: Serr500 от Ноябрь 02, 2012, 20:00
retranslateUi повторно вызывает все setText(tr(...)). Если Вы вызвали tr(...) внутри кода, то она вернёт переведённую строку, которую Вы можете использовать в дальнейшем. Но эта строка сама уже не изменится. Чтобы получить её перевод на другой язык, необходимо вновь вызвать tr(...) после installTranslator. В данном случае можно создать метод, который присваивает элементам строки, требующие перевода и выполнять его в двух местах - в конструкторе и в обработчике changeEvent, в котором ловим событие QEvent::LanguageChange.


Название: Re: Перевод при помощи tr()
Отправлено: Bepec от Ноябрь 02, 2012, 20:03
Версию Qt укажите. Какой IDE используете? (Qt creator/VS/eclipse)
И вопрос - в лингвисте русский язык нормально отображался - исходные строки?

Выложите проект.

PS возможно что http://www.prog.org.ru/topic_20210_0.html, но тут уже нужно больше информации о вашей проблеме.


Название: Re: Перевод при помощи tr()
Отправлено: UndeadDragon от Ноябрь 02, 2012, 20:16
retranslateUi повторно вызывает все setText(tr(...)). Если Вы вызвали tr(...) внутри кода, то она вернёт переведённую строку, которую Вы можете использовать в дальнейшем. Но эта строка сама уже не изменится. Чтобы получить её перевод на другой язык, необходимо вновь вызвать tr(...) после installTranslator. В данном случае можно создать метод, который присваивает элементам строки, требующие перевода и выполнять его в двух местах - в конструкторе и в обработчике changeEvent, в котором ловим событие QEvent::LanguageChange.
Вы цитируете мануал? Я внимательно читал его.
Как вы можете увидеть в коде выше, я вызываю QAction::setText(tr(...)); после QTranslator::load();, но ничего не меняется, как я описал. installTranslator выполняется в самом начале конструктора.

Версию Qt укажите. Какой IDE используете? (Qt creator/VS/eclipse)
И вопрос - в лингвисте русский язык нормально отображался - исходные строки?

Выложите проект.

PS возможно что http://www.prog.org.ru/topic_20210_0.html, но тут уже нужно больше информации о вашей проблеме.
VS, действительно используется Windows-1251. Я, правда, сразу догадался указать явно эту кодировку и лингвист ее понял и вроде бы нормально скомпилировал .qm. Но перевод не выполняется, точнее только через retranslateUi, и хотя я пытался тупо повторить теже действия, что в retranslateUi, ничего не вышло (или иероглифы от использования UTF8 или ничего не меняется). А у меня много еще мест, где надо вручную переводить, и вот тут никак.
С файлом проекта лучше не стоит, мы с вами уже встречались на эту тему, с тех пор проект дорос до 3к+ строк и имеет кучу зависимостей от моего компьютера (да-да, я зря так сделал и криволапка вообще :( ).
P.S. Qt 4.8.1

P.P.S Вот так до компиляции:
http://s51.radikal.ru/i133/1211/55/a1aa11334d23.png
После компиляции если открыть .qm файл, то уже сбита будет кодировка и вопросики.


Название: Re: Перевод при помощи tr()
Отправлено: Bepec от Ноябрь 02, 2012, 21:10
Вы лапками попробуйте набить lrelease для своего ts файла. Если он ругнётся на 1251 кодек, то проблема в либке лингвиста и кодировке 1251.

К сожалению не помню нашей встречи :)

Никто не требует у вас полный проект. Берёте создаёте новый проект, втуляете туда надпись, tr("") в коде, делаете файл перевода, компилируете и проект и перевод, смотрите результат. Если результат такой же - пересылаете этот маленький проект и тут уже я смогу вам помочь :) А если результат нормальный - то вы сами перепишите свой проект правильно :)

3к+ это малый проект. Вы счастливы, если для вас это большой :D

PS мой самый маленький проект - 7к строк  :)


Название: Re: Перевод при помощи tr()
Отправлено: UndeadDragon от Ноябрь 02, 2012, 22:08
Вы лапками попробуйте набить lrelease для своего ts файла. Если он ругнётся на 1251 кодек, то проблема в либке лингвиста и кодировке 1251.

К сожалению не помню нашей встречи :)

Никто не требует у вас полный проект. Берёте создаёте новый проект, втуляете туда надпись, tr("") в коде, делаете файл перевода, компилируете и проект и перевод, смотрите результат. Если результат такой же - пересылаете этот маленький проект и тут уже я смогу вам помочь :) А если результат нормальный - то вы сами перепишите свой проект правильно :)

3к+ это малый проект. Вы счастливы, если для вас это большой :D

PS мой самый маленький проект - 7к строк  :)
Ну, я же не работаю пока :) Для курсового проекта вполне приличный размер, на мой взгляд.
Смотрите, я попробовал lrelease, что-то вылезло про то, что он не может использовать 1251 и заменяет ее Latin1.
Цитировать
D:\Projects\OS\ApproximateView\ApproximateView>D:\qt\bin\lrelease approximatevie
w.pro
Неверно задано имя папки.
Could not find qmake configuration fileUsing OS scope before setting MAKEFILE_GE
NERATORProject MESSAGE: You are running qmake on a generated .pro file. This may
 not work!D:/Projects/OS/ApproximateView/ApproximateView/qwt.pri(18): Using OS s
cope before setting MAKEFILE_GENERATORD:/Projects/OS/ApproximateView/Approximate
View/qwt.pri(24): Using OS scope before setting MAKEFILE_GENERATORNo QTextCodec
for windows-1251 available. Using Latin1.
Updating 'D:/Projects/OS/ApproximateView/ApproximateView/EN.qm'...
    Generated 133 translation(s) (133 finished and 0 unfinished)
No QTextCodec for windows-1251 available. Using Latin1.
Updating 'D:/Projects/OS/ApproximateView/ApproximateView/RU.qm'...
    Generated 0 translation(s) (0 finished and 0 unfinished)
    Ignored 133 untranslated source text(s)
No QTextCodec for windows-1251 available. Using Latin1.
Updating 'D:/Projects/OS/ApproximateView/ApproximateView/RU_GOP.qm'...
    Generated 0 translation(s) (0 finished and 0 unfinished)
    Ignored 133 untranslated source text(s)

D:\Projects\OS\ApproximateView\ApproximateView>
Чего делать тепереча? Кажется у вас было так же, но вы так и не поделились там в топе рабочей версией лингвиста)


Название: Re: Перевод при помощи tr()
Отправлено: lit-uriy от Ноябрь 02, 2012, 22:48
я не припомню такой проблемы, может потому, что у меня исходники в UTF-8 и использую в основном trUtf8()


Название: Re: Перевод при помощи tr()
Отправлено: Bepec от Ноябрь 02, 2012, 23:03
Угу. Это проблема исключительно W разрабов с требованиями русского языка в коде программы (как исходных данных для перевода).

to UndeadDragon
Отчего же, поделился я тогда, тема была закрыта :)
Однако из-за одного инцидента пришлось удалить прикреплённый архив.

Ловите файлик, но не могу сказать, как будет работать с Qt 4.8.1, ибо скомпилен и проверен только на 4.7.1.

PS сервер не даёт залить коре, потому даю ссылку, надеюсь Пантер меня не вшпилит за это :)
скобочки и пробелы убрать :D
http ://files. mail[точка}ru /7JHCA1


Название: Re: Перевод при помощи tr()
Отправлено: UndeadDragon от Ноябрь 02, 2012, 23:14
Угу. Это проблема исключительно W разрабов с требованиями русского языка в коде программы (как исходных данных для перевода).

to UndeadDragon
Отчего же, поделился я тогда, тема была закрыта :)
Однако из-за одного инцидента пришлось удалить прикреплённый архив.

Ловите файлик, но не могу сказать, как будет работать с Qt 4.8.1, ибо скомпилен и проверен только на 4.7.1.

PS сервер не даёт залить коре, потому даю ссылку, надеюсь Пантер меня не вшпилит за это :)
скобочки и пробелы убрать :D
http ://files. mail[точка}ru /7JHCA1
Эээм О.о
http://gyazo.com/ff1521be06e47b27830890fb00c5d683


Название: Re: Перевод при помощи tr()
Отправлено: Bepec от Ноябрь 02, 2012, 23:25
Логично. У вас в системе пути прописаны к 4.8.1 дллкам.
А 4.8.1 != 4.7.2.


Название: Re: Перевод при помощи tr()
Отправлено: UndeadDragon от Ноябрь 02, 2012, 23:28
Логично. У вас в системе пути прописаны к 4.8.1 дллкам.
А 4.8.1 != 4.7.2.
Дык, просто дайте .dll своей версии)
Хотя в общем и целом могу поковыряться и сделать дефолтный язык англ., вроде бы это решит проблему.


Название: Re: Перевод при помощи tr()
Отправлено: Bepec от Ноябрь 02, 2012, 23:30
Эмм... Конечно понять то, что dll, которые я скинул вам являются теми, с которыми я его собирал, вам не дано? :)

Повторю - у вас цепляет ВАШИ dll-ки по ВАШИМ путям. Мои дллки соответственно не при делах получаются.

PS ибо у меня без прописанных путей всё путём работает.


Название: Re: Перевод при помощи tr()
Отправлено: UndeadDragon от Ноябрь 03, 2012, 00:04
Эмм... Конечно понять то, что dll, которые я скинул вам являются теми, с которыми я его собирал, вам не дано? :)

Повторю - у вас цепляет ВАШИ dll-ки по ВАШИМ путям. Мои дллки соответственно не при делах получаются.

PS ибо у меня без прописанных путей всё путём работает.
Как грубо =\
Так не бывает. Поиск .dll всегда начинается с директории программы. Поэтому если цепляет чужое - значит своего нет.
Я просто пропустил XML файл в прикрепленных к вашим сообщениям, теперь запустилось.


Название: Re: Перевод при помощи tr()
Отправлено: Bepec от Ноябрь 03, 2012, 00:54
Нууу... Просто когда люди в 11 вечера в пятницу смотрят форум, разгребают тему полу-годовой давности, ищут этот древний файл, скачивают depends чтобы увидеть зависимости, добавляют к нему библиотеки. Потом скачивают UPX, сжимают библиотеки. Потом распихивают всё это по разным архивам, прикрепляют 2 архива к сообщению. Третий архив заливают на mail.ru. А потом ему говорят - не катит, а далее ещё и
Цитировать
Как грубо =\
. А он ведь лишь хотел помочь...


Название: Re: Перевод при помощи tr()
Отправлено: UndeadDragon от Ноябрь 03, 2012, 19:04
Нууу... Просто когда люди в 11 вечера в пятницу смотрят форум, разгребают тему полу-годовой давности, ищут этот древний файл, скачивают depends чтобы увидеть зависимости, добавляют к нему библиотеки. Потом скачивают UPX, сжимают библиотеки. Потом распихивают всё это по разным архивам, прикрепляют 2 архива к сообщению. Третий архив заливают на mail.ru. А потом ему говорят - не катит, а далее ещё и
Цитировать
Как грубо =\
. А он ведь лишь хотел помочь...
Все нормально, спасибо большое)