Spec-Zone.ru › Qt 5.6

Международная локализация с Qt

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

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

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

QTextCodec

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

QTextDecoder

Декриптор на основе состояния

QTextEncoder

Кодировщик на основе состояния

QTranslator

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

QCollator

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

QCollatorSortKey

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

QLocale

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

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

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

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, прочитайте страницу wiki Перевод 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 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/archives/qt-5.6/internationalization.html

Spec-Zone.ru

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