Введение в разработку приложений на платформе Atom/MeeGo. Граничин О.Н - 108 стр.

UptoLike

108
9.4.1. QString, tr*(), QT_TR*_NOOP
Чтобы обеспечить интернационализацию, для каждого литерного текста (текста в кавычках)
необходимо использовать функцию [QCoreApplication::]tr() ли её синонимфункцию
translate()). Она одновременно является маркером для утилиты lupdate (о которой подробнее речь
пойдёт дальше) и статической функцией С++, осуществляющей перевод.
Например, предполагая, что LoginWidgetподкласс QWidget:
LoginWidget::LoginWidget()
{
QLabel *label = new QLabel(tr("Password:"));
...
}
Этот пример подходит для 99% выводимых пользователю строк.
Внимание! Необходимо быть очень осторожным в использовании функции tr(). Например, такой
пример будет работать:
QPushButton *ok = new QPushButton( tr("OK"),this);
А этотнет:
QCString str = "OK";
QPushButton *ok = new QPushButton( tr(str),this);
Точнее говоря, в результате работы второго примера выведется непереведённая строка «OK». Это
произойдёт в связи с тем, что утилита для интернационализации lupdate «не увидит» связанное
значение переменной.
В литерный текст, передающийся в функцию tr(), как и в QString можно подставлять
аргументы, например:
tr( QString("Cannot open %1").arg(fileName) )
и
tr( "Cannot open %1" ).arg( fileName )
эквивалентны. Однако, следует пользоваться вторым вариантом, так как первый осложняет работу
транслятора lupdate.
В отличие от функций tr(), макрос QT_TR_NOOP() является лишь маркером и не осуществляет
перевод заключённого в него текста. Пример:
const char *strings[2] = {
QT_TR_NOOP("OK"),
QT_TR_NOOP("Cancel")
};
for ( int i = 0; i < 2; i++ ) {
QButton *but = new QPushButton(strings[i],this);
}
В этом примере, возможно неожиданно для разработчика, отобразится кнопка с непереведённым
текстом. Для того чтобы вывести переведённый текст, необходимо было писать:
QButton *but = new QPushButton( tr(strings[i]),this);
9.4.2. Трансляция приложения
Трансляция MeeGo приложений осуществляется в три шага:
1. Необходимо запустить утилиту lupdate, которая возьмёт переводимые тексты из исходного С++
кода и поместит их в .TS файл (обычнопо одному на язык). Утилита распознаёт вызовы
функций tr() и макрос QT_TR*_NOOP().
2. Отредактировать получившийся TS файл для того, чтобы перевести текст (вручную (TS файл
содержит правильный XML), либо используя утилиту Qt Linguist).
3. Вызвать утилиту lrelease для того чтобы получить легковесный файл с сообщениями (.QM