Russian Qt Forum
Ноябрь 25, 2024, 14:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод при помощи tr() [РЕШЕНО]  (Прочитано 6778 раз)
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);
}
Помогите, пожалуйста, а то запарился. Заранее всем спасибо Улыбающийся
« Последнее редактирование: Ноябрь 03, 2012, 19:05 от UndeadDragon » Записан
Serr500
Гость
« Ответ #1 : Ноябрь 02, 2012, 20:00 »

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

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

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

PS возможно что http://www.prog.org.ru/topic_20210_0.html, но тут уже нужно больше информации о вашей проблеме.
Записан
UndeadDragon
Гость
« Ответ #3 : Ноябрь 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 файл, то уже сбита будет кодировка и вопросики.
« Последнее редактирование: Ноябрь 02, 2012, 20:27 от UndeadDragon » Записан
Bepec
Гость
« Ответ #4 : Ноябрь 02, 2012, 21:10 »

Вы лапками попробуйте набить lrelease для своего ts файла. Если он ругнётся на 1251 кодек, то проблема в либке лингвиста и кодировке 1251.

К сожалению не помню нашей встречи Улыбающийся

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

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

PS мой самый маленький проект - 7к строк  Улыбающийся
Записан
UndeadDragon
Гость
« Ответ #5 : Ноябрь 02, 2012, 22:08 »

Вы лапками попробуйте набить lrelease для своего ts файла. Если он ругнётся на 1251 кодек, то проблема в либке лингвиста и кодировке 1251.

К сожалению не помню нашей встречи Улыбающийся

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

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

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>
Чего делать тепереча? Кажется у вас было так же, но вы так и не поделились там в топе рабочей версией лингвиста)
« Последнее редактирование: Ноябрь 02, 2012, 22:11 от UndeadDragon » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Ноябрь 02, 2012, 22:48 »

я не припомню такой проблемы, может потому, что у меня исходники в UTF-8 и использую в основном trUtf8()
Записан

Юра.
Bepec
Гость
« Ответ #7 : Ноябрь 02, 2012, 23:03 »

Угу. Это проблема исключительно W разрабов с требованиями русского языка в коде программы (как исходных данных для перевода).

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

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

PS сервер не даёт залить коре, потому даю ссылку, надеюсь Пантер меня не вшпилит за это Улыбающийся
скобочки и пробелы убрать Веселый
http ://files. mail[точка}ru /7JHCA1
« Последнее редактирование: Ноябрь 02, 2012, 23:09 от Bepec » Записан
UndeadDragon
Гость
« Ответ #8 : Ноябрь 02, 2012, 23:14 »

Угу. Это проблема исключительно W разрабов с требованиями русского языка в коде программы (как исходных данных для перевода).

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

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

PS сервер не даёт залить коре, потому даю ссылку, надеюсь Пантер меня не вшпилит за это Улыбающийся
скобочки и пробелы убрать Веселый
http ://files. mail[точка}ru /7JHCA1
Эээм О.о
http://gyazo.com/ff1521be06e47b27830890fb00c5d683
Записан
Bepec
Гость
« Ответ #9 : Ноябрь 02, 2012, 23:25 »

Логично. У вас в системе пути прописаны к 4.8.1 дллкам.
А 4.8.1 != 4.7.2.
Записан
UndeadDragon
Гость
« Ответ #10 : Ноябрь 02, 2012, 23:28 »

Логично. У вас в системе пути прописаны к 4.8.1 дллкам.
А 4.8.1 != 4.7.2.
Дык, просто дайте .dll своей версии)
Хотя в общем и целом могу поковыряться и сделать дефолтный язык англ., вроде бы это решит проблему.
Записан
Bepec
Гость
« Ответ #11 : Ноябрь 02, 2012, 23:30 »

Эмм... Конечно понять то, что dll, которые я скинул вам являются теми, с которыми я его собирал, вам не дано? Улыбающийся

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

PS ибо у меня без прописанных путей всё путём работает.
Записан
UndeadDragon
Гость
« Ответ #12 : Ноябрь 03, 2012, 00:04 »

Эмм... Конечно понять то, что dll, которые я скинул вам являются теми, с которыми я его собирал, вам не дано? Улыбающийся

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

PS ибо у меня без прописанных путей всё путём работает.
Как грубо =\
Так не бывает. Поиск .dll всегда начинается с директории программы. Поэтому если цепляет чужое - значит своего нет.
Я просто пропустил XML файл в прикрепленных к вашим сообщениям, теперь запустилось.
Записан
Bepec
Гость
« Ответ #13 : Ноябрь 03, 2012, 00:54 »

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

Нууу... Просто когда люди в 11 вечера в пятницу смотрят форум, разгребают тему полу-годовой давности, ищут этот древний файл, скачивают depends чтобы увидеть зависимости, добавляют к нему библиотеки. Потом скачивают UPX, сжимают библиотеки. Потом распихивают всё это по разным архивам, прикрепляют 2 архива к сообщению. Третий архив заливают на mail.ru. А потом ему говорят - не катит, а далее ещё и
Цитировать
Как грубо =\
. А он ведь лишь хотел помочь...
Все нормально, спасибо большое)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.213 секунд. Запросов: 23.