Spec-Zone.ru › Qt 5.14

Локализация с Qt

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

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

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

QCollator

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

QCollatorSortKey

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

QLocale

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

QTextCodec

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

QTextDecoder

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

QTextEncoder

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

QTranslator

Поддержка интернационализации для вывода текста

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

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

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. Это означает, что вам обычно не нужно знать ничего о системе письма, используемой на конкретном языке, если вы не хотите создавать собственные элементы управления вводом текста. В некоторых языках, таких как арабский или языки Индийского субконтинента, ширина и форма глифа изменяются в зависимости от окружающих символов. Для учета этого используйте 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 myappTranslator;
    myappTranslator.load("myapp_" + QLocale::system().name());
    app.installTranslator(&myappTranslator);

    return app.exec();
}

Для приложения, поддерживающего перевод, создается объект QTranslator, затем перевод загружается в соответствии с текущей локалью во время выполнения, и, наконец, объект переводчика устанавливается в приложение.

Поиск переводов Qt

Вы также можете использовать QLibraryInfo::location() для поиска переводов для используемых модулей Qt. Путь к переводам можно запросить во время выполнения, передав QLibraryInfo::TranslationsPath в эту функцию.

Доступные каталоги

Каталоги переводов Qt находятся в репозитории qttranslations.

Предупреждение: Переводы Qt предоставляются сообществом Qt без каких-либо гарантий. Переводы могут отсутствовать, быть устаревшими или полностью некорректными, вплоть до вредоносных. Рекомендуется проверять все переводы, которые вы распространяете.

Мета-каталог qt_ содержит сохранившиеся переводы Qt, которые были включены в каталог qt_ в Qt 4. Он был создан, чтобы облегчить портирование приложений из Qt 4 в Qt 5. Мета-каталог зависит от переводов, которые могут отсутствовать, потому что они относятся к ненужным или устаревшим модулям, что может привести к сбою загрузки переводов. Если вы используете модули, новые в Qt 5, в своем приложении, вы должны указать имена каталогов для этих модулей, даже если вы используете мета-каталог.

В следующей таблице перечислены каталоги переводов, доступные для модулей и инструментов Qt в Qt.

Модуль или инструмент Qt Каталог
Помощник Qt assistant_
Qt Bluetooth qtconnectivity_
Qt Concurrent qtbase_
Qt Core qtbase_
Qt D-Bus qtbase_
Qt Designer designer_
Qt GUI qtbase_
Qt Справка qt_help_
Qt Linguist linguist_
Qt Location qtlocation_
Qt Multimedia qtmultimedia_
Qt Multimedia Widgets qtmultimedia_
Qt NFC qtconnectivity_
Qt Network qtbase_
Qt Positioning qtlocation_
Qt Print Support qtbase_
Qt QML qtdeclarative_
Qt Quick qtdeclarative_
Qt Quick Controls qtquickcontrols2_
Qt Quick Widgets qtdeclarative_
Qt Serial Port qtserialport_
Qt SQL qtbase_
Qt WebEngine qtwebengine_
Qt WebSockets qtwebsockets_
Qt Widgets qtbase_
Пример: Основные модули Qt

Например, чтобы найти переводы для основных модулей Qt, таких как Qt Core, Qt GUI, Qt Network и Qt Widgets, добавьте следующий код в функцию main():

    QTranslator qtTranslator;
    qtTranslator.load(QLocale::system(), QStringLiteral("qtbase_"));
    app.installTranslator(&qtTranslator);

Поддержка кодировок

Класс 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 с big-endian кодировкой, даже если это порядок, предписанный стандартом Unicode в отсутствие протоколов более высокого уровня.
macOS

Подробную информацию о локализации macOS см. в документе Qt для macOS здесь.

Связанные страницы

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

Примеры Qt Linguist

Использование Qt Linguist для локализации вашего приложения Qt

Руководство Qt Linguist

Руководство Qt Linguist: Разработчики

Руководство Qt Linguist: Менеджер релизов

Руководство Qt Linguist: Формат файла TS

Руководство Qt Linguist: Переводы на основе идентификаторов текста

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

Руководство Qt Linguist: Переводчики

Правила перевода для множественного числа

Резюме правил перевода для множественного числа, созданных инструментами i18n Qt.

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

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

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

Spec-Zone.ru

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