Международная локализация с Qt
Международная локализация и локализация приложения — это процессы адаптации приложения к различным языкам, региональным особенностям и техническим требованиям целевого рынка. Международная локализация означает проектирование программного приложения таким образом, чтобы его можно было адаптировать к различным языкам и регионам без внесения изменений в код. Локализация означает адаптацию международного программного обеспечения для определенного региона или языка путем добавления компонентов, специфичных для локали (таких как форматы дат, времени и чисел), и перевода текста.
Соответствующие классы и API Qt
Эти классы поддерживают международную локализацию приложений Qt.
Сравнение строк в соответствии с алгоритмом сортировки, локализованным для конкретного региона |
|
Может использоваться для ускорения сортировки строк |
|
Преобразование между числами и их строковыми представлениями на разных языках |
|
Преобразования между кодировками текста |
|
Декодер, работающий по состоянию |
|
Кодировщик, работающий по состоянию |
|
Поддержка международной локализации для вывода текста |
Языки и письменности
В некоторых случаях международная локализация проста, например, сделать приложение США доступным для пользователей Австралии или Великобритании может потребовать немного больше, чем несколько исправлений орфографии. Но чтобы сделать приложение США пригодным для использования японскими пользователями, или корейское приложение — для немецких пользователей, потребуется, чтобы программное обеспечение работало не только на разных языках, но и использовало различные методы ввода, кодировки символов и соглашения о представлении.
Qt старается сделать международную локализацию максимально простой для разработчиков. Все элементы управления вводом и методы рисования текста в Qt предлагают встроенную поддержку всех поддерживаемых языков. Встроенный движок шрифтов способен правильно и привлекательно отображать текст, содержащий символы из различных систем письменности одновременно.
Qt поддерживает большинство используемых сегодня языков, в частности:
- Все восточноазиатские языки (китайский, японский и корейский)
- Все западноевропейские языки (использующие латинский алфавит)
- Арабский
- Кириллические языки (русский, украинский и др.)
- Греческий
- Иврит
- Тайский и лаосский
- Все шрифты в Unicode 6.2, которые не требуют специальной обработки
- Бенгальский
- Бирманский (Мьянма)
- Деванагари
- Гуджарати
- Гурмукхи
- Каннада
- Кхмерский
- Малаялам
- Тамильский
- Телугу
- Тибетский
Вышеупомянутый список поддерживается и будет работать на всех платформах, при условии, что на системе установлены шрифты для отображения этих систем письменности.
В Windows, Linux и Unix с FontConfig (поддержка шрифтов со стороны клиента) также поддерживаются следующие языки:
- Дхивехи (Таана)
- Сирийский
- Н'Ко
В macOS также поддерживаются следующие языки:
- Ориа
- Сингальский
Многие из этих систем письменности обладают особыми характеристиками:
- Особенности поведения при переходе на новую строку. Некоторые азиатские языки пишутся без пробелов между словами. Переход на новую строку может происходить либо после каждого символа (с исключениями), как в китайском, японском и корейском языках, либо после логических границ слов, как в тайском.
- Двунаправленное письмо. Арабский и иврит пишутся справа налево, за исключением чисел и встроенного английского текста, который пишется слева направо. Точное поведение определено в Техническом приложении Unicode #9.
- Неразрывные или диакритические знаки (ударения или умлауты в европейских языках). Некоторые языки, такие как вьетнамский, широко используют эти знаки, и некоторые символы могут иметь более одного знака одновременно для уточнения произношения.
- Лигатуры. В особых контекстах некоторые пары символов заменяются комбинированным глифом, образующим лигатуру. Частые примеры — лигатуры fl и fi, используемые в верстке американских и европейских книг.
Qt пытается учесть все перечисленные выше особые характеристики. Обычно вам не нужно беспокоиться об этих функциях, если вы используете элементы управления вводом Qt (например, QLineEdit, QTextEdit и производные классы или элемент Quick TextInput) и элементы отображения Qt (например, QLabel и элемент Text Qt Quick).
Поддержка этих систем письменности прозрачна для программиста и полностью инкапсулирована в текстовом движке Qt. Это означает, что вам не нужно знать ничего о системе письменности, используемой на конкретном языке, кроме следующих небольших моментов:
- QPainter::drawText(int x, int y, const QString &str) всегда будет отображать строку с левым краем в указанной позиции x, y. Это обычно даёт выравнивание строк по левому краю. Арабские и ивритские строки в приложениях обычно выравниваются по правому краю, поэтому для этих языков используйте версию drawText(), которая принимает QRect, так как это обеспечит выравнивание в соответствии с языком.
- Если вы пишете свои собственные элементы управления вводом текста, используйте QTextLayout. В некоторых языках (например, арабский или языки индийского субконтинента) ширина и форма глифа изменяются в зависимости от окружающих символов, что учитывает QTextLayout. Для написания элементов управления вводом обычно требуются определенные знания используемых шрифтов. Обычно самый простой способ — наследоваться от QLineEdit или QTextEdit.
Дополнительную информацию о том, как локализовать исходный код, см. в Документации по написанию исходного кода для перевода и Документации по международной локализации и локализации с Qt Quick.
Генерация переводов
Qt предоставляет отличную поддержку перевода приложений Qt C++ и Qt Quick на местные языки. Руководители выпусков, переводчики и разработчики могут использовать инструменты перевода Qt для выполнения своих задач.
Инструменты перевода Qt, Qt Linguist, lupdate, и lrelease установлены в подкаталоге bin базового каталога, в который установлен Qt. Дополнительную информацию об их использовании см. в Руководстве Qt Linguist.
Само Qt содержит несколько тысяч строк, которые также необходимо перевести на целевые языки. Вы найдете ряд файлов переводов в репозитории qttranslations. Прежде чем начать переводить Qt, прочтите страницу вики Перевода Qt на другие языки.
Включение перевода
Обычно функция main() вашего приложения будет выглядеть так:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator myappTranslator;
myappTranslator.load("myapp_" + QLocale::system().name());
app.installTranslator(&myappTranslator);
...
return app.exec();
} Для приложения, поддерживающего перевод, создаётся объект QTranslator, затем перевод загружается в соответствии с текущей локалью во время выполнения, и, наконец, объект переводчика устанавливается в приложение.
Обратите внимание на использование QLibraryInfo::location() для поиска переводов Qt. Разработчики должны запрашивать путь к переводам во время выполнения, передавая QLibraryInfo::TranslationsPath в эту функцию вместо использования переменной окружения QTDIR в своих приложениях.
Поддержка кодировок
Класс QTextCodec и средства в QTextStream упрощают поддержку многих устаревших кодировок ввода-вывода для данных ваших пользователей. При запуске приложения локаль машины определяет 8-битную кодировку, используемую при работе с внешними 8-битными данными. QTextCodec::codecForLocale() возвращает кодировку, которая может использоваться для преобразования между этой кодировкой локали и Unicode.
Приложению иногда могут потребоваться кодировки, отличные от стандартной локальной 8-битной кодировки. Например, приложение в кириллической кодировке KOI8-R (фактический стандарт кодировки в России) может потребоваться для вывода кириллицы в кодировке ISO 8859-5. Код для этого будет:
QString string = ...; // some Unicode text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QByteArray encodedString = codec->fromUnicode(string); Для преобразования Unicode в локальные 8-битные кодировки доступен ярлык: функция QString::toLocal8Bit() возвращает такие 8-битные данные. Другой полезный ярлык — QString::toUtf8(), который возвращает текст в 8-битной кодировке UTF-8: это идеально сохраняет информацию Unicode, выглядя как обычный ASCII, если текст полностью состоит из ASCII символов.
Для преобразования в обратном направлении существуют удобные функции QString::fromUtf8() и QString::fromLocal8Bit() или общий код, продемонстрированный этим преобразованием из кириллицы ISO 8859-5 в Unicode:
QByteArray encodedString = ...; // some ISO 8859-5 encoded text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QString string = codec->toUnicode(encodedString); Ввод-вывод Unicode должен использоваться, так как это обеспечивает максимальную переносимость документов между пользователями по всему миру. Однако во многих случаях по-прежнему необходимо поддерживать другие кодировки, поскольку ваши пользователи должны будут обрабатывать существующие документы. Наиболее важная дополнительная кодировка для поддержки — та, которая возвращается QTextCodec::codecForLocale(), так как она, скорее всего, потребуется пользователю для общения с другими людьми и приложениями (это кодировка, используемая local8Bit()).
Qt поддерживает большинство наиболее часто используемых кодировок в родном виде. Полный список поддерживаемых кодировок см. в документации по QTextCodec.
В некоторых случаях и для менее часто используемых кодировок может потребоваться создать свой подкласс QTextCodec. В зависимости от срочности, может быть полезно обратиться в службу технической поддержки Qt или задать вопрос на qt-interest форуме, чтобы узнать, не работает ли кто-то уже над поддержкой этой кодировки.
Локализация чисел, дат, времени и валюты
Локализация — это процесс адаптации к местным соглашениям, например, представление дат и времени с использованием предпочтительных в данной местности форматов. Для локализованных чисел, дат, времени и строк валюты используйте класс QLocale.
Локализация изображений не рекомендуется. Выбирайте ясные значки, подходящие для всех регионов, а не полагайтесь на местные каламбуры или растянутые метафоры. Исключение составляют изображения стрелок влево и вправо, которые могут потребоваться перевернуть для арабских и ивритских локалей.
Динамический перевод
Некоторые приложения, такие как Qt Linguist, должны поддерживать изменения настроек языка пользователя во время работы. Чтобы виджеты реагировали на изменения установленных объектов QTranslator, переопределите функцию виджета changeEvent(), чтобы проверить, является ли событие событием LanguageChange, и обновите текст, отображаемый виджетами, используя функцию tr() обычным способом. Например:
void MyWidget::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
titleLabel->setText(tr("Document Title"));
...
okPushButton->setText(tr("&OK"));
} else
QWidget::changeEvent(event);
} Все остальные события изменения должны передаваться с помощью вызова стандартной реализации функции.
Список установленных переводчиков может изменяться в ответ на событие LocaleChange, или приложение может предоставить интерфейс пользователя, который позволит пользователю изменить текущий язык приложения.
Обработчик событий по умолчанию для подклассов QWidget отвечает на событие QEvent::LanguageChange и вызовет эту функцию при необходимости.
События LanguageChange публикуются при установке нового перевода с помощью функции QCoreApplication::installTranslator(). Кроме того, другие компоненты приложения также могут заставить виджеты обновить себя, опубликовав события LanguageChange для них.
Поддержка системы
Некоторые операционные системы и графические системы, на которых работает Qt, поддерживают Unicode только частично. Уровень поддержки, доступный в базовой системе, оказывает некоторое влияние на поддержку, которую Qt может предоставить на этих платформах, хотя в целом приложения Qt не должны сильно беспокоиться о платформоспецифических ограничениях.
Unix/X11
- Локализованные шрифты и методы ввода. Qt скрывает их и предоставляет ввод и вывод Unicode.
- Конвенции файловой системы, такие как UTF-8, в настоящее время используются по умолчанию в большинстве вариантов Unix. Все функции файлов Qt допускают Unicode, но преобразуют имена файлов в локальное кодирование 8 бит, так как это соглашение Unix (см. QFile::setEncodingFunction(), чтобы изучить альтернативные кодировки).
- Ввод-вывод файлов по умолчанию использует локальное кодирование 8 бит с вариантами Unicode в QTextStream.
- В некоторых старых дистрибутивах Unix частично поддерживаются некоторые локали. Например, если у вас есть каталог
/usr/share/locale/ja_JP.EUC, это не обязательно означает, что вы можете отображать японский текст; вам также необходимо установить японские шрифты, и каталог/usr/share/locale/ja_JP.EUCдолжен быть полным. Для достижения наилучших результатов используйте полные локали от вашего поставщика системы.
Linux
- Qt предоставляет полную поддержку Unicode, включая методы ввода, шрифты, буфер обмена, перетаскивание.
- Файловая система обычно закодирована в UTF-8 во всех современных дистрибутивах Linux и не должна вызывать проблем. Ввод-вывод файлов по умолчанию использует UTF-8.
Windows
- Qt предоставляет полную поддержку Unicode, включая методы ввода, шрифты, буфер обмена, перетаскивание и имена файлов.
- Ввод-вывод файлов по умолчанию использует Latin1, с вариантами Unicode в QTextStream. Обратите внимание, что некоторые программы Windows не понимают текстовые файлы Unicode с большим порядком байтов, даже если это порядок, предписанный стандартом Unicode при отсутствии протоколов более высокого уровня.
macOS
Подробную информацию о переводе, специфичном для macOS, см. в документе Qt для macOS здесь.
Связанные страницы
Обзор правил перевода для множественного числа, созданных инструментами i18n Qt. |
|
Использование Qt Linguist для локализации вашего приложения Qt |
|
Справочник Qt Linguist: Переводы на основе идентификаторов текста |
Перевод на основе идентификаторов текста поддерживает крупные проекты с множеством целевых локалей и множеством текстов для перевода |
Как писать исходный код таким образом, чтобы пользовательский текст можно было перевести. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/internationalization.html