Spec-Zone.ru › Qt 5.13

Международная локализация с 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, прочитайте страницу вики Перевод 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 mailing list, чтобы узнать, не работает ли кто-то уже над поддержкой этой кодировки.

Локализация чисел, дат, времени и валюты

Локализация — это процесс адаптации к местным конвенциям, например, представление дат и времени с использованием предпочтительных локальных форматов. Для локализованных чисел, дат, времени и строковых представлений валюты используйте класс 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 здесь.

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

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

Примеры 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.13/internationalization.html

Spec-Zone.ru

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