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, и формирует файлы переводов, содержащие все эти подготовленные к переводу строки. Эти файлы могут затем быть переданы переводчику для добавления к ним перевода строк. Эта процедура рассматривается позже в данной главе в разделе «Перевод приложений».
В общем виде вызов tr имеет следующий синтаксис:
Контекст::tr(исходныйТекст, комментарий)
Здесь Контекст — имя подкласса QObject, в котором используется макрос Q_OBJECT. Нам не требуется его указывать, если мы вызываем tr в функции—члене рассматриваемого класса. Аргумент исходныйТекст — текстовая константа, которую нужно будет переводить. Аргумент комментарий является необязательным, и он может использоваться для предоставления переводчику дополнительной информации.
Ниже приводится несколько примеров:
01 RockyWidget::RockyWidget(QWidget *parent)
02 : QWidget(parent)
03 {
04 QString str1 = tr("Letter");
05 QString str2 = RockyWidget::tr("Letter");
06 QString str3 = SnazzyDialog::tr("Letter");
07 QString str4 = SnazzyDialog::tr("Letter", "US paper size");
08 }
Первые два вызова tr выполняются в контексте объекта RockyWidget (скалистый виджет), а вторые два — в контексте объекта SnazzyDialog (притягательное диалоговое окно). В качестве исходного текста во всех четырех случаях используется слово «Letter» (буква). Последний вызов имеет также комментарий, помогающий переводчику точнее понять смысл исходного текста.
Строки в различных контекстах (классах) переводятся независимо друг от друга. Переводчики, как правило, одновременно работают только с одним контекстом, причем часто при этом работает приложение и на экране отображается виджет или диалоговое окно, которые необходимо перевести.