локализация

 
0
 
C++
ava
gordmiand | 17.03.2013, 22: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-файл для всего проекта, так как тогда придется ВСЕ строки ЗАНОВО переводить... 
Comments (6)
ava
math64 | 18.03.2013, 08:20 #
Запускаешь lupdate заново - новые строки появляются автоматически, старые больше не нужные помечаются как устаревшие.
Если новые с тем же текстом, что и старые - подбирается перевод, иначе перевода нет.
Далее запускаешь Лингвиста.

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


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

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

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


Повторно вызывать setText никогда не требовалось
ava
Amp | 18.03.2013, 11:10 #
Цитата (Jeka178RUS @  18.3.2013,  11:02 findReferencedText)
Не совсем понял что значит еще раз?

ТС хочет, чтобы перевод применился ко всем виджетам без перезапуска приложения и с минимумом телодвижений с его стороны.
ava
bsa | 18.03.2013, 13:57 #
Amp, ты ошибаешься.
ava
gordmiand | 18.03.2013, 19:55 #
вопрос в том можно ли после вызова installTranslator не вызывать еще раз setText-ы для строк, которые нужно перевести...почему перевод после выполнения installTranslator автоматически не применяется к строкам?
ava
math64 | 19.03.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() закрыть форму и открыть заново.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  bsa   gordmiand   Amp   Jeka178RUS   math64
advanced
Submit