21
Темы лекции: Интернационализация. Практическое задание: Интернационализация. Тренер: Игорь Шкулипа, к.т.н. С++ Библиотеки STL и Qt. Занятие 9

C++ STL & Qt. Занятие 09

Embed Size (px)

Citation preview

Page 1: C++ STL & Qt. Занятие 09

Темы лекции: Интернационализация.

Практическое задание: Интернационализация.

Тренер: Игорь Шкулипа, к.т.н.

С++ Библиотеки STL и Qt. Занятие 9

Page 2: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 2

Возможности интернационализации Qt

Кроме латинского алфавита, используемого для английского и многихевропейских языков, Qt обеспечивает широкую поддержку остальныхмировых систем записи:

• Qt применяет Unicode в программном интерфейсе и во внутреннихоперациях. В приложении можно обеспечить всем пользователямодинаковую поддержку независимо от того, какой языкприменяется в пользовательском интерфейсе;

• текстовый процессор Qt может работать со всеми основныминелатинскими системами записи, в том числе с арабской,китайской, кириллицей, ивритом, японской, корейской, тайской ис языками Индии;

• процессор компоновки Qt обеспечивает компоновку справа налеводля таких языков, как арабский и иврит;

• для определенных языков требуются специальные методы вводатекста. Такие виджеты редактирования, как QLineEdit и QTextEdit,хорошо работают в условиях применения любого метода вводатекста, существующего в системе пользователя.

Page 3: C++ STL & Qt. Занятие 09

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 поддерживает на всех платформах следующиесистемы записи: арабскую, китайскую, кириллическую, греческую, иврит,японскую, корейскую, лаосскую, латинскую, тайскую и вьетнамскую.

Page 4: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 4

Unicode файлы

Строку в кодировке Unicode мы можем использовать в любом местепрограммного интерфейса Qt, где допускается применение строки типаQString. Qt сам отвечает за правильное ее отображение и преобразование всоответствущие кодировки при взаимодействии с операционной системой.

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

По умолчанию QTextStream использует локальную системную 8-битовуюкодировку (которая доступна при помощи функцииQTextCodec::codecForLocale()), как для чтения, так и для записи. Длястран Америки и Западной Европы это обычно подразумевает кодировкуLatin-1.

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

stream.setCodec("UTF-16");

Page 5: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 5

Возможности перевода интерфейсаРазрешение ввода текста пользователями на их родном языке часто

оказывается недостаточным; необходимо также перевести весьпользовательский интерфейс.

В Qt это делается просто: все видимые пользователем строки обработайтефункцией tr() и воспользуйтесь утилитами Qt для подготовки файловперевода на требуемый язык.

Qt имеет утилиту с графическим пользовательским интерфейсом, котораяназывается Qt Linguist и предназначается для переводчиков. QtLinguist дополняется двумя консольными программами lupdate иlrelease, которые обычно используются разработчиками приложений.

В большинстве приложений файл перевода загружается при запускеприложения с учетом установленных пользователем параметровлокализации. Однако в некоторых случаях пользователям необходимопереключаться с одного языка на другой во время выполненияприложения. Это так же можно делать в Qt, а благодаря системекомпоновки Qt различные компоненты интерфейса пользователя будутавтоматически перенастраиваться, чтобы обеспечить достаточно местадля переведенного текста, когда его размер превышает размерисходного текста.

Page 6: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 6

Использование tr() для всех текстов

Где бы программа не использовала "текст в кавычках" для текста,который будет отображен пользователю, убедитесь что онобрабатывается функцией QCoreApplication::translate().

Все что для этого необходимо - использовать QObject::tr(). Например,предположим что LoginWidget - это подкласс QWidget:

LoginWidget::LoginWidget()

{

QLabel *label = new QLabel(tr("Password:"));

...

}

Page 7: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 7

Перевод интерфейса

Если мы хотим иметь многоязыковую версию нашего приложения, мыдолжны сделать две вещи:

• убедиться, что все строки, которые видит пользователь, проходятчерез функцию tr();

• загрузить файл перевода (.qm) при запуске приложения.

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

Однако применение функции tr() почти не требует дополнительныхусилий и оставляет дверь открытой для их перевода когда-нибудь вбудущем.

Page 8: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 8

Динамический перевод

В некоторых ситуациях пользователям необходимо иметь возможностьдинамического переключения языка. Если приложение постоянноиспользуется попеременно различными пользователями, можетвозникнуть необходимость в изменении языка без перезапускаприложения.

Обеспечение в приложении возможности динамического переключенияязыков требует немного большего, чем просто загрузка одного файлаперевода при запуске приложения, но это нетрудно сделать.

Порядок действий должен быть следующим:

• предусмотрите средство, с помощью которого пользовательсможет переключаться с одного языка на другой;

• для каждого виджета или диалогового окна укажите всетребующие перевода строки в отдельном методе, который должензаканчиваться вызовом retranslateUi(), и вызывайте этот методвсякий раз при изменении языка.

Page 9: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 9

Пример. Перевод окна.

Page 10: C++ STL & Qt. Занятие 09

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)

Page 11: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 11

Создание перевода в Qt Linguist

Page 12: C++ STL & Qt. Занятие 09

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>

Page 13: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 13

Файл проекта

Page 14: C++ STL & Qt. Занятие 09

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;

};

Page 15: C++ STL & Qt. Занятие 09

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;

}

Page 16: C++ STL & Qt. Занятие 09

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);

}

Page 17: C++ STL & Qt. Занятие 09

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();

}

Page 18: C++ STL & Qt. Занятие 09

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);

}

Page 19: C++ STL & Qt. Занятие 09

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();

}

Page 20: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 20

Результат

Page 21: C++ STL & Qt. Занятие 09

http://www.slideshare.net/IgorShkulipa 21

Лабораторная работа №9. Интернационализация

Перевести Тетрис на русский, украинский и английский язык.Реализовать возможность динамического переключения языков.