Выбрать главу

QPushButton *button = new QPushButton(tr("♦♦"));

По умолчанию Qt считает, что аргументы функции tr() задаются в кодировке Latin-1. Для изменения этого необходимо вызвать статическую функцию QTextCodec::setCodecForTr(). Например:

QTextCodec *japaneseCodec = QTextCodec::codecForName("EUC-JP");

QTextCodec::setCodecForTr(japaneseCodec);

Это должно быть сделано до первого вызова tr(). Обычно мы делаем это в функции main() непосредственно после создания объекта QApplication.

Другие используемые в программе строки будут по-прежнему интерпретироваться как строки, представленные в кодировке Latin-1. Если программисты хотят вводить японские иероглифы и здесь, они могут явно преобразовывать их в Unicode, используя объект QTextCodec:

QString text = japaneseCodec->toUnicode("♦♦♦♦♦");

Можно поступить по-другому и указать Qt на необходимость применения особого преобразования между типами const char * и QString путем вызова функции QTextCodec::setCodecForCStrings():

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("EUC-JP"));

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

Ниже приводится список кодировок, поддерживаемых Qt 4:

• Apple Roman

• Big5

• Big5-HKSCS

• EUC-JP

• EUC-KR

• GB18030-0

• IBM 850

• IBM 866

• IBM 874

• ISO 2022-JP

• ISO 8859-1

• ISO 8859-2

• ISO 8859-3

• ISO 8859-4

• ISO 8859-5

• ISO 8859-6

• ISO 8859-7

• ISO 8859-8

• ISO 8859-9

• ISO 8859-10

• ISO 8859-13

• ISO 8859-14

• ISO 8859-15

• ISO 8859-16

• Iscii-Bng

• Iscii-Dev

• Iscii-Gjr

• Iscii-Knd

• Iscii-Mlm

• Iscii-Ori

• Iscii-Pnj

• Iscii-Tlg

• Iscii-Tml

• JIS X 0201

• JIS X 0208

• KOI8-R

• KOI8-U

• MuleLao-1

• ROMAN8

• Shift-JIS

• TIS-620

• TSCII

• UTF-8

• UTF-16

• UTF-16BE

• UTF-16LE

• Windows-1250

• Windows-1251

• Windows-1252

• Windows-1253

• Windows-1254

• Windows-1255

• Windows-1256

• Windows-1257

• Windows-1258

• WINSAMI2

Для всех этих кодировок функция QTextCodec::codecForName() всегда будет возвращать достоверный указатель. Другие кодировки можно обеспечить путем создания подкласса QTextCodec.

Создание переводимого интерфейса приложения

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

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

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

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

Функция tr() является статической функцией, определенной в классе QObject и переопределяемой в каждом подклассе, в котором встречается макрос Q_OBJECT. При ее использовании в рамках подкласса QObject мы можем вызывать tr() без ограничений. Вызов tr() возвращает перевод строки, если он имеется, и первоначальный текст в противном случае.

Для подготовки файлов переводов мы должны запустить утилиту Qt lupdate. Эта утилита собирает все строковые константы, которые встречаются в вызовах tr(), и формирует файлы переводов, содержащие все эти подготовленные к переводу строки. Эти файлы могут затем быть переданы переводчику для добавления к ним перевода строк. Эта процедура рассматривается позже в данной главе в разделе «Перевод приложений».