c++ stl & qt. Занятие 09
TRANSCRIPT
Темы лекции: Интернационализация.
Практическое задание: Интернационализация.
Тренер: Игорь Шкулипа, к.т.н.
С++ Библиотеки STL и Qt. Занятие 9
http://www.slideshare.net/IgorShkulipa 2
Возможности интернационализации Qt
Кроме латинского алфавита, используемого для английского и многихевропейских языков, Qt обеспечивает широкую поддержку остальныхмировых систем записи:
• Qt применяет Unicode в программном интерфейсе и во внутреннихоперациях. В приложении можно обеспечить всем пользователямодинаковую поддержку независимо от того, какой языкприменяется в пользовательском интерфейсе;
• текстовый процессор Qt может работать со всеми основныминелатинскими системами записи, в том числе с арабской,китайской, кириллицей, ивритом, японской, корейской, тайской ис языками Индии;
• процессор компоновки Qt обеспечивает компоновку справа налеводля таких языков, как арабский и иврит;
• для определенных языков требуются специальные методы вводатекста. Такие виджеты редактирования, как QLineEdit и QTextEdit,хорошо работают в условиях применения любого метода вводатекста, существующего в системе пользователя.
http://www.slideshare.net/IgorShkulipa 3
Работа с UnicodeUnicode является стандартной кодировкой, которая поддерживает большинство
мировых систем записи.
В основе кодировки Unicode лежит идея использования для хранения символов16 бит, а не 8, и поэтому она позволяет закодировать примерно 65 000символов вместо только 256. Unicode содержит коды ASCII и ISO 8859-1(Latin-1) в качестве своего подмножества с прежним их представлением.Например, английская буква «А» имеет значение 0x41 в кодировках ASCII,Latin-1 и Unicode, а буква «В» имеет значение 0xD1 в кодировках Latin-1 иUnicode.
Класс QString хранит строковые значения в кодировке Unicode. Каждыйсимвол QString имеет 16-битовый тип QChar, а не 8-битовый тип char. Нижеприводятся два способа установки первого символа строки на значение«А»:
str[0] = 'A';
str[0] = QChar(0x41);
Более подробную информацию о Unicode, можно найти по адресуhttp://www.unicode.org.
Текстовый процессор в Qt 4 поддерживает на всех платформах следующиесистемы записи: арабскую, китайскую, кириллическую, греческую, иврит,японскую, корейскую, лаосскую, латинскую, тайскую и вьетнамскую.
http://www.slideshare.net/IgorShkulipa 4
Unicode файлы
Строку в кодировке Unicode мы можем использовать в любом местепрограммного интерфейса Qt, где допускается применение строки типаQString. Qt сам отвечает за правильное ее отображение и преобразование всоответствущие кодировки при взаимодействии с операционной системой.
Особенно внимательными надо быть при чтении и записи текстовых файлов.Текстовые файлы могут использовать различные кодировки, и частооказывается невозможным определить кодировку текстового файла по егосодержанию.
По умолчанию QTextStream использует локальную системную 8-битовуюкодировку (которая доступна при помощи функцииQTextCodec::codecForLocale()), как для чтения, так и для записи. Длястран Америки и Западной Европы это обычно подразумевает кодировкуLatin-1.
Если мы разработали свой собственный формат файлов и собираемсясчитывать и записывать произвольные символы Unicode, мы можемсохранять данные в кодировке Unicode с помощью вызова
stream.setCodec("UTF-16");
http://www.slideshare.net/IgorShkulipa 5
Возможности перевода интерфейсаРазрешение ввода текста пользователями на их родном языке часто
оказывается недостаточным; необходимо также перевести весьпользовательский интерфейс.
В Qt это делается просто: все видимые пользователем строки обработайтефункцией tr() и воспользуйтесь утилитами Qt для подготовки файловперевода на требуемый язык.
Qt имеет утилиту с графическим пользовательским интерфейсом, котораяназывается Qt Linguist и предназначается для переводчиков. QtLinguist дополняется двумя консольными программами lupdate иlrelease, которые обычно используются разработчиками приложений.
В большинстве приложений файл перевода загружается при запускеприложения с учетом установленных пользователем параметровлокализации. Однако в некоторых случаях пользователям необходимопереключаться с одного языка на другой во время выполненияприложения. Это так же можно делать в Qt, а благодаря системекомпоновки Qt различные компоненты интерфейса пользователя будутавтоматически перенастраиваться, чтобы обеспечить достаточно местадля переведенного текста, когда его размер превышает размерисходного текста.
http://www.slideshare.net/IgorShkulipa 6
Использование tr() для всех текстов
Где бы программа не использовала "текст в кавычках" для текста,который будет отображен пользователю, убедитесь что онобрабатывается функцией QCoreApplication::translate().
Все что для этого необходимо - использовать QObject::tr(). Например,предположим что LoginWidget - это подкласс QWidget:
LoginWidget::LoginWidget()
{
QLabel *label = new QLabel(tr("Password:"));
...
}
http://www.slideshare.net/IgorShkulipa 7
Перевод интерфейса
Если мы хотим иметь многоязыковую версию нашего приложения, мыдолжны сделать две вещи:
• убедиться, что все строки, которые видит пользователь, проходятчерез функцию tr();
• загрузить файл перевода (.qm) при запуске приложения.
Ничего подобного не надо делать, если приложения никогда не будутпереводиться на другой язык.
Однако применение функции tr() почти не требует дополнительныхусилий и оставляет дверь открытой для их перевода когда-нибудь вбудущем.
http://www.slideshare.net/IgorShkulipa 8
Динамический перевод
В некоторых ситуациях пользователям необходимо иметь возможностьдинамического переключения языка. Если приложение постоянноиспользуется попеременно различными пользователями, можетвозникнуть необходимость в изменении языка без перезапускаприложения.
Обеспечение в приложении возможности динамического переключенияязыков требует немного большего, чем просто загрузка одного файлаперевода при запуске приложения, но это нетрудно сделать.
Порядок действий должен быть следующим:
• предусмотрите средство, с помощью которого пользовательсможет переключаться с одного языка на другой;
• для каждого виджета или диалогового окна укажите всетребующие перевода строки в отдельном методе, который должензаканчиваться вызовом retranslateUi(), и вызывайте этот методвсякий раз при изменении языка.
http://www.slideshare.net/IgorShkulipa 9
Пример. Перевод окна.
http://www.slideshare.net/IgorShkulipa 10
Создание перевода
Directory of .\translate
[.] [..] main.cpp mainwindow.cpp
mainwindow.h mainwindow.ui translate.pro translate.pro.user
translate.qrc [translations]
8 File(s) 38 871 bytes
3 Dir(s) 19 325 493 248 bytes free
translate>lupdate -pro translate.pro -ts translate.ts
lupdate warning: TS files from command line will override TRANSLATIONS
in translate.pro.
Updating 'translate.ts'...
Found 9 source text(s) (9 new and 0 already existing)
http://www.slideshare.net/IgorShkulipa 11
Создание перевода в Qt Linguist
http://www.slideshare.net/IgorShkulipa 12
Ресурсы
<RCC>
<qresource prefix="/">
<file>translations/translate_rus.ts</file>
<file>translations/translate_eng.ts</file>
<file>translations/translate_eng.qm</file>
<file>translations/translate_rus.qm</file>
</qresource>
</RCC>
http://www.slideshare.net/IgorShkulipa 14
Класс окна
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent, QTranslator *translat);
~MainWindow();
void Retranslate();
void Initialize();
private slots:
void setEnglish();
void setRussian();
private:
Ui::MainWindow *ui;
QAction* engAction;
QAction* rusAction;
QMenu* menu;
QPushButton* button;
QTextEdit* textEdit;
QTranslator* translator;
};
http://www.slideshare.net/IgorShkulipa 15
Реализация
MainWindow::MainWindow(QWidget *parent, QTranslator *translat) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
Initialize();
ui->setupUi(this);
ui->menuBar->addMenu(menu);
translator=translat;
this->Retranslate();
}
MainWindow::~MainWindow()
{
delete ui;
}
http://www.slideshare.net/IgorShkulipa 16
Метод инициализации
void MainWindow::Initialize()
{
menu=new QMenu(tr("Language"), this);
engAction=menu->addAction(tr("English"), this,
SLOT(setEnglish()),Qt::CTRL+Qt::Key_E);
rusAction=menu->addAction(tr("Russian"), this,
SLOT(setRussian()),Qt::CTRL+Qt::Key_R);
engAction->setCheckable(true);
rusAction->setCheckable(true);
engAction->setChecked(true);
rusAction->setChecked(false);
button=new QPushButton(this);
textEdit=new QTextEdit(this);
textEdit->setGeometry(10, 40, 550, 310);
button->setGeometry(10, 360, 550, 25);
textEdit->setEnabled(true);
button->setEnabled(true);
}
http://www.slideshare.net/IgorShkulipa 17
Методы смены языков
void MainWindow::setEnglish()
{
engAction->setChecked(true);
rusAction->setChecked(false);
translator->load(
QApplication::applicationDirPath()+"/translate_eng.qm");
QApplication::installTranslator(translator);
this->Retranslate();
}
void MainWindow::setRussian()
{
engAction->setChecked(false);
rusAction->setChecked(true);
translator->load(
QApplication::applicationDirPath()+"/translate_rus.qm");
QApplication::installTranslator(translator);
this->Retranslate();
}
http://www.slideshare.net/IgorShkulipa 18
Метод Retranslate
void MainWindow::Retranslate()
{
menu->setTitle(tr("Language"));
engAction->setText(tr("English"));
rusAction->setText(tr("Russian"));
textEdit->setText(tr("Some text"));
button->setText(tr("Push me"));
ui->retranslateUi(this);
}
http://www.slideshare.net/IgorShkulipa 19
main
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator* translator=new QTranslator();
translator->load(
a.applicationDirPath()+"/translate_eng.qm");
a.installTranslator(translator);
MainWindow w(NULL, translator);
w.show();
return a.exec();
}
http://www.slideshare.net/IgorShkulipa 21
Лабораторная работа №9. Интернационализация
Перевести Тетрис на русский, украинский и английский язык.Реализовать возможность динамического переключения языков.