Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > локализация


Автор: gordmiand 17.3.2013, 21:23
Есть достаточно большая программа — модулей (классов) 20...
делаю ее локализацию:
1.    в progect.pro прописываю TRANSLATIONS = rus.ts
2.    даю команду lupdate progect.pro — создается rus.ts
3.    программой Qt Linguist открываю rus.ts и перевожу в нем все строки (nazvanie 1, nazvanie 2,...)
4.    компилирую rus.qm
5.    в MainClass программы:
Код

QTranslator translate;
translate.load("rus.qm");
qApp->installTranslator(&translate);

label1->setText(tr("nazvanie 1"));
label2->setText(tr("nazvanie 2"));
…


А можно ли каким-то образом автоматически применить загруженный «переводчик» (translate) ко всем строкам, а не вызывать еще раз соответствующие setText-ы?

Все работает верно, вопросы в дальнейшем развитии программы:
1.    если в каком-то модуле появляется новая строка, требующая перевода, как мне ее добавить в уже существующий ts-файл — ТОЛЬКО РУКАМИ дописать в него секцию вида
    <message>
        <source>text</source>
        <translation>перевод</translation>
    </message>
2.    если к программе добавляется новый модуль допустим с парой десятков новых строк — тут как быть? Не создавать же заново ts-файл для всего проекта, так как тогда придется ВСЕ строки ЗАНОВО переводить... 

Автор: math64 18.3.2013, 08:20
Запускаешь lupdate заново - новые строки появляются автоматически, старые больше не нужные помечаются как устаревшие.
Если новые с тем же текстом, что и старые - подбирается перевод, иначе перевода нет.
Далее запускаешь Лингвиста.

Если формы создаются дизайнером - у них будет создан метод для переименования метод и т.д. Для форм создаваемых вручную, такой метод нужно создавать самому.

Автор: Jeka178RUS 18.3.2013, 11:02
Цитата(gordmiand @ 17.3.2013,  21:23)
А можно ли каким-то образом автоматически применить загруженный «переводчик» (translate) ко всем строкам, а не вызывать еще раз соответствующие setText-ы?

Не совсем понял что значит еще раз?

Если лабел из формы он должен будет сам перевестись, если лабел создан руками то просто убедись что параметр был пропущен через tr
Код

QLabel lbl = new QLabel(tr("Some text"));


Повторно вызывать setText никогда не требовалось

Автор: Amp 18.3.2013, 11:10
Цитата(Jeka178RUS @  18.3.2013,  11:02 Найти цитируемый пост)
Не совсем понял что значит еще раз?

ТС хочет, чтобы перевод применился ко всем виджетам без перезапуска приложения и с минимумом телодвижений с его стороны.

Автор: bsa 18.3.2013, 13:57
Amp, ты ошибаешься.

Автор: gordmiand 18.3.2013, 19:55
вопрос в том можно ли после вызова installTranslator не вызывать еще раз setText-ы для строк, которые нужно перевести...почему перевод после выполнения installTranslator автоматически не применяется к строкам?
кстати похоже вместо tr надо использовать translate - тогда в ts-файле (и в лингвисте) эти строки будут корректно отображены (если исходная строка русскоязычная), иначе - абракадабра...или руками в ts- файл дописывать utf-8="true" для каждой <message>-секции, что не есть хорошо... или как-то можно, используя tr, корректно отобразить строки в ts-файле?  

Автор: math64 19.3.2013, 07:46
Нужно использовать trUtf8() если для исходников используется кодировка utf8.
Виджеты сами по себе, ничего про то что нужно переводить не знают. setText() ничего не переоводит - он устанавливает текст, переведённый translate()/tr()/trUtf8().
Cтрока может быть задана отдельно от вызова tr():
Код

char * str[] = { QT_TR_NOOP("string1"), QT_TR_NOOP("string2") };
label->setText(tr(str[i]));

Например, если у тебя в одной метке текст на английском, а на соседней перевод на русский, при вызове installTranslator ничего переводить не нужно.
Если используется дизайнер, создаются setupUi() и retranslateUi(). Но нужно позаботиться, чтобы после installTranslator() было вызвано retranslateUi() - этого в автомате не произойдёт.
Если форма создаётся вручную, retranslateUi() нужно создавать самостоятельно или после вызова installTranslator() закрыть форму и открыть заново.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)