SlideShare a Scribd company logo
1 of 21
Download to read offline
Темы лекции: Интернационализация.
Практическое задание: Интернационализация.
Тренер: Игорь Шкулипа, к.т.н.
С++ Библиотеки STL и Qt. Занятие 9
http://www.slideshare.net/IgorShkulipa 2
Возможности интернационализации Qt
Кроме латинского алфавита, используемого для английского и многих
европейских языков, Qt обеспечивает широкую поддержку остальных
мировых систем записи:
• Qt применяет Unicode в программном интерфейсе и во внутренних
операциях. В приложении можно обеспечить всем пользователям
одинаковую поддержку независимо от того, какой язык
применяется в пользовательском интерфейсе;
• текстовый процессор Qt может работать со всеми основными
нелатинскими системами записи, в том числе с арабской,
китайской, кириллицей, ивритом, японской, корейской, тайской и
с языками Индии;
• процессор компоновки Qt обеспечивает компоновку справа налево
для таких языков, как арабский и иврит;
• для определенных языков требуются специальные методы ввода
текста. Такие виджеты редактирования, как QLineEdit и QTextEdit,
хорошо работают в условиях применения любого метода ввода
текста, существующего в системе пользователя.
http://www.slideshare.net/IgorShkulipa 3
Работа с Unicode
Unicode является стандартной кодировкой, которая поддерживает большинство
мировых систем записи.
В основе кодировки 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 и предназначается для переводчиков. Qt
Linguist дополняется двумя консольными программами 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 13
Файл проекта
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 20
Результат
http://www.slideshare.net/IgorShkulipa 21
Лабораторная работа №9. Интернационализация
Перевести Тетрис на русский, украинский и английский язык.
Реализовать возможность динамического переключения языков.

More Related Content

What's hot

C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.Igor Shkulipa
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroAnton Moiseenko
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Anton Moiseenko
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Anton Moiseenko
 

What's hot (20)

C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
Step 1
Step 1Step 1
Step 1
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 

Viewers also liked

JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
Production diary 9
Production diary 9Production diary 9
Production diary 9Laila Jaleel
 
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9vijay bhosekar
 
power point of extra material about eye trauma
power point of extra material about eye traumapower point of extra material about eye trauma
power point of extra material about eye traumaEman Elnezami
 
Advanced LinkedIn Techniques
Advanced LinkedIn TechniquesAdvanced LinkedIn Techniques
Advanced LinkedIn TechniquesJames Weber
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.Igor Shkulipa
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.Igor Shkulipa
 
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9vijay bhosekar
 
Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Ida Morán
 
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...Luigi Sambolino
 
Production diary 10
Production diary 10Production diary 10
Production diary 10Laila Jaleel
 
Time Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self careTime Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self careAndrea Fortuin
 
Production diary 9
Production diary 9Production diary 9
Production diary 9Laila Jaleel
 
Production diary 7
Production diary 7Production diary 7
Production diary 7Laila Jaleel
 
Challenge Passport-sm
Challenge Passport-smChallenge Passport-sm
Challenge Passport-smLewis Pitzer
 

Viewers also liked (20)

JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
Production diary 9
Production diary 9Production diary 9
Production diary 9
 
Nowhere But Niigata
Nowhere But NiigataNowhere But Niigata
Nowhere But Niigata
 
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
 
power point of extra material about eye trauma
power point of extra material about eye traumapower point of extra material about eye trauma
power point of extra material about eye trauma
 
Advanced LinkedIn Techniques
Advanced LinkedIn TechniquesAdvanced LinkedIn Techniques
Advanced LinkedIn Techniques
 
CONSTRUCTION DOCS_FINAL TO PRINT
CONSTRUCTION DOCS_FINAL TO PRINTCONSTRUCTION DOCS_FINAL TO PRINT
CONSTRUCTION DOCS_FINAL TO PRINT
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
 
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
 
InPay OpenReaktor
InPay OpenReaktorInPay OpenReaktor
InPay OpenReaktor
 
Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Capitulo IV análisis de resultados
Capitulo IV análisis de resultados
 
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
 
Production diary 10
Production diary 10Production diary 10
Production diary 10
 
Steffy
SteffySteffy
Steffy
 
Time Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self careTime Out - A beginners guide to meditation for self care
Time Out - A beginners guide to meditation for self care
 
Production diary 9
Production diary 9Production diary 9
Production diary 9
 
Production diary 7
Production diary 7Production diary 7
Production diary 7
 
Brochure
BrochureBrochure
Brochure
 
Challenge Passport-sm
Challenge Passport-smChallenge Passport-sm
Challenge Passport-sm
 

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

Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish SQALab
 
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Dmitry Savchenko
 
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...IT Share
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеYakubovichDA
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreTatyanazaxarova
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — LuaYury Yurevich
 
Павел Брылов, Skype
Павел Брылов, SkypeПавел Брылов, Skype
Павел Брылов, SkypeOntico
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Что должен уметь Linux программист
Что должен уметь Linux программистЧто должен уметь Linux программист
Что должен уметь Linux программистru_Parallels
 
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...Vadim Ponomarev
 

Similar to C++ STL & Qt. Занятие 09. (20)

190
190190
190
 
Net framework
Net frameworkNet framework
Net framework
 
Dotnet
DotnetDotnet
Dotnet
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
378 васильев куницын
378 васильев куницын378 васильев куницын
378 васильев куницын
 
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
 
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программирование
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCore
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
 
Павел Брылов, Skype
Павел Брылов, SkypeПавел Брылов, Skype
Павел Брылов, Skype
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
Что должен уметь Linux программист
Что должен уметь Linux программистЧто должен уметь Linux программист
Что должен уметь Linux программист
 
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
 
Кратко о Linux
Кратко о LinuxКратко о Linux
Кратко о Linux
 
Dev collaboration
Dev collaborationDev collaboration
Dev collaboration
 
лекция 3
лекция 3лекция 3
лекция 3
 

More from Igor Shkulipa

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03. Igor Shkulipa
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.Igor Shkulipa
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.Igor Shkulipa
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.Igor Shkulipa
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.Igor Shkulipa
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.Igor Shkulipa
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.Igor Shkulipa
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.Igor Shkulipa
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.Igor Shkulipa
 

More from Igor Shkulipa (20)

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
 

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

  • 1. Темы лекции: Интернационализация. Практическое задание: Интернационализация. Тренер: Игорь Шкулипа, к.т.н. С++ Библиотеки STL и Qt. Занятие 9
  • 2. http://www.slideshare.net/IgorShkulipa 2 Возможности интернационализации Qt Кроме латинского алфавита, используемого для английского и многих европейских языков, Qt обеспечивает широкую поддержку остальных мировых систем записи: • Qt применяет Unicode в программном интерфейсе и во внутренних операциях. В приложении можно обеспечить всем пользователям одинаковую поддержку независимо от того, какой язык применяется в пользовательском интерфейсе; • текстовый процессор Qt может работать со всеми основными нелатинскими системами записи, в том числе с арабской, китайской, кириллицей, ивритом, японской, корейской, тайской и с языками Индии; • процессор компоновки Qt обеспечивает компоновку справа налево для таких языков, как арабский и иврит; • для определенных языков требуются специальные методы ввода текста. Такие виджеты редактирования, как QLineEdit и QTextEdit, хорошо работают в условиях применения любого метода ввода текста, существующего в системе пользователя.
  • 3. http://www.slideshare.net/IgorShkulipa 3 Работа с Unicode Unicode является стандартной кодировкой, которая поддерживает большинство мировых систем записи. В основе кодировки 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 поддерживает на всех платформах следующие системы записи: арабскую, китайскую, кириллическую, греческую, иврит, японскую, корейскую, лаосскую, латинскую, тайскую и вьетнамскую.
  • 4. http://www.slideshare.net/IgorShkulipa 4 Unicode файлы Строку в кодировке Unicode мы можем использовать в любом месте программного интерфейса Qt, где допускается применение строки типа QString. Qt сам отвечает за правильное ее отображение и преобразование в соответствущие кодировки при взаимодействии с операционной системой. Особенно внимательными надо быть при чтении и записи текстовых файлов. Текстовые файлы могут использовать различные кодировки, и часто оказывается невозможным определить кодировку текстового файла по его содержанию. По умолчанию QTextStream использует локальную системную 8-битовую кодировку (которая доступна при помощи функции QTextCodec::codecForLocale()), как для чтения, так и для записи. Для стран Америки и Западной Европы это обычно подразумевает кодировку Latin-1. Если мы разработали свой собственный формат файлов и собираемся считывать и записывать произвольные символы Unicode, мы можем сохранять данные в кодировке Unicode с помощью вызова stream.setCodec("UTF-16");
  • 5. http://www.slideshare.net/IgorShkulipa 5 Возможности перевода интерфейса Разрешение ввода текста пользователями на их родном языке часто оказывается недостаточным; необходимо также перевести весь пользовательский интерфейс. В Qt это делается просто: все видимые пользователем строки обработайте функцией tr() и воспользуйтесь утилитами Qt для подготовки файлов перевода на требуемый язык. Qt имеет утилиту с графическим пользовательским интерфейсом, которая называется Qt Linguist и предназначается для переводчиков. Qt Linguist дополняется двумя консольными программами lupdate и lrelease, которые обычно используются разработчиками приложений. В большинстве приложений файл перевода загружается при запуске приложения с учетом установленных пользователем параметров локализации. Однако в некоторых случаях пользователям необходимо переключаться с одного языка на другой во время выполнения приложения. Это так же можно делать в Qt, а благодаря системе компоновки Qt различные компоненты интерфейса пользователя будут автоматически перенастраиваться, чтобы обеспечить достаточно места для переведенного текста, когда его размер превышает размер исходного текста.
  • 6. http://www.slideshare.net/IgorShkulipa 6 Использование tr() для всех текстов Где бы программа не использовала "текст в кавычках" для текста, который будет отображен пользователю, убедитесь что он обрабатывается функцией QCoreApplication::translate(). Все что для этого необходимо - использовать QObject::tr(). Например, предположим что LoginWidget - это подкласс QWidget: LoginWidget::LoginWidget() { QLabel *label = new QLabel(tr("Password:")); ... }
  • 7. http://www.slideshare.net/IgorShkulipa 7 Перевод интерфейса Если мы хотим иметь многоязыковую версию нашего приложения, мы должны сделать две вещи: • убедиться, что все строки, которые видит пользователь, проходят через функцию tr(); • загрузить файл перевода (.qm) при запуске приложения. Ничего подобного не надо делать, если приложения никогда не будут переводиться на другой язык. Однако применение функции tr() почти не требует дополнительных усилий и оставляет дверь открытой для их перевода когда-нибудь в будущем.
  • 8. http://www.slideshare.net/IgorShkulipa 8 Динамический перевод В некоторых ситуациях пользователям необходимо иметь возможность динамического переключения языка. Если приложение постоянно используется попеременно различными пользователями, может возникнуть необходимость в изменении языка без перезапуска приложения. Обеспечение в приложении возможности динамического переключения языков требует немного большего, чем просто загрузка одного файла перевода при запуске приложения, но это нетрудно сделать. Порядок действий должен быть следующим: • предусмотрите средство, с помощью которого пользователь сможет переключаться с одного языка на другой; • для каждого виджета или диалогового окна укажите все требующие перевода строки в отдельном методе, который должен заканчиваться вызовом retranslateUi(), и вызывайте этот метод всякий раз при изменении языка.
  • 10. 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)
  • 14. 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; };
  • 15. 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; }
  • 16. 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); }
  • 17. 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(); }
  • 18. 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); }
  • 19. 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(); }
  • 21. http://www.slideshare.net/IgorShkulipa 21 Лабораторная работа №9. Интернационализация Перевести Тетрис на русский, украинский и английский язык. Реализовать возможность динамического переключения языков.