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(), и вызывайте этот метод
всякий раз при изменении языка.