Spec-Zone.ru › Qt 5.9

Международная поддержка с Qt

Локализация и международная поддержка приложения — это процессы адаптации приложения к различным языкам, региональным различиям и техническим требованиям целевого рынка. Международная поддержка подразумевает проектирование программного приложения таким образом, чтобы его можно было адаптировать к различным языкам и регионам без внесения изменений в исходный код. Локализация — это адаптация приложения, созданного с международной поддержкой, к конкретному региону или языку путём добавления компонентов, специфичных для данной локали (например, форматов даты, времени и чисел), и перевода текстов.

Соответствующие классы и API Qt

Эти классы поддерживают международную поддержку приложений Qt.

QTextCodec

Преобразование между кодировками текста

QTextDecoder

Декодер, работающий в состоянии

QTextEncoder

Кодировщик, работающий в состоянии

QTranslator

Поддержка международной поддержки для вывода текста

QCollator

Сравнение строк в соответствии с алгоритмом сортировки, локализованным для конкретного языка

QCollatorSortKey

Можно использовать для ускорения сортировки строк

QLocale

Перевод между числами и их строковыми представлениями на разных языках

Языки и письменности

В некоторых случаях международная поддержка проста, например, для предоставления американского приложения пользователям из Австралии или Великобритании, возможно, потребуется только несколько исправлений орфографии. Но для того, чтобы сделать американское приложение доступным для японских пользователей, или корейское приложение — для немецких пользователей, потребуется, чтобы программное обеспечение работало не только на разных языках, но и использовало разные методы ввода, кодировки символов и соглашения о представлении.

Qt пытается сделать международную поддержку максимально простой для разработчиков. Все элементы управления вводом и выводом текста в Qt предлагают встроенную поддержку всех поддерживаемых языков. Встроенный движок шрифтов способен правильно и привлекательно отображать текст, содержащий символы из различных систем письма одновременно.

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

  • Все языки Восточной Азии (китайский, японский и корейский)
  • Все западные языки (использующие латинский алфавит)
  • Арабский
  • Кириллические языки (русский, украинский и т. д.)
  • Греческий
  • Иврит
  • Тайский и лаосский
  • Все системы письма в Unicode 6.2, которые не требуют специальной обработки
  • Бенгальский
  • Бирманский (Мьянма)
  • Деванагари
  • Гуджарати
  • Гурмухи
  • Каннада
  • Кхмерский
  • Малаялам
  • Тамильский
  • Телугу
  • Тибетский

Вышеуказанный список поддерживается и будет работать на всех платформах, при условии, что на системе установлены шрифты для отображения этих систем письма.

В Windows, Linux и Unix с FontConfig (поддержка шрифтов на стороне клиента) также поддерживаются следующие языки:

  • Дхивехи (Таана)
  • Сирийский
  • Н’Ко

В macOS также поддерживаются следующие языки:

  • Ориа
  • Сингальский

Многие из этих систем письма обладают особыми характеристиками:

  • Особое поведение переноса строки. Некоторые азиатские языки пишутся без пробелов между словами. Перенос строки может происходить либо после каждого символа (с исключениями), как в китайском, японском и корейском, либо после логических границ слова, как в тайском.
  • Двунаправленное написание. Арабский и иврит пишутся справа налево, за исключением чисел и вставленного английского текста, который пишется слева направо. Точное поведение определяется в Unicode Technical Annex #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 поддерживает большинство часто используемых кодировок в режиме native. Полный список поддерживаемых кодировок см. в документации 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 Linguist для локализации вашего приложения Qt

Обзор процесса перевода

Справочник Qt Linguist

Справочник Qt Linguist: Разработчики

Справочник Qt Linguist: Руководитель выпуска

Справочник Qt Linguist: Формат файла TS

Справочник Qt Linguist: Переводы на основе идентификатора текста

Переводы на основе идентификатора текста обеспечивают поддержку крупных проектов с множеством целевых языковых наборов и большим количеством текстов для перевода.

Справочник Qt Linguist: Переводчики

Написание исходного кода для перевода

Как написать исходный код таким образом, чтобы пользовательский видимый текст можно было перевести.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/internationalization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API