Spec-Zone.ru › Qt 6.0

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

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

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

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

QCollator

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

QCollatorSortKey

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

QLocale

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

QStringConverter

Базовый класс для кодирования и декодирования текста

QStringDecoder

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

QStringEncoder

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

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(QLocale(), QLatin1String("myapp"), QLatin1String("_"), QLatin1String(":/i18n"));
    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 Concurrent qtbase_
Qt Core qtbase_
Qt D-Bus qtbase_
Qt Designer designer_
Qt GUI qtbase_
Qt Help qt_help_
Qt Linguist linguist_
Qt Network qtbase_
Qt Print Support qtbase_
Qt QML qtdeclarative_
Qt Quick qtdeclarative_
Qt Quick Controls qtquickcontrols2_
Qt Quick Widgets qtdeclarative_
Qt SQL qtbase_
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() возвращает кодек, который может быть использован для преобразования между кодировкой этой локали и Юникодом.

Приложению иногда могут потребоваться кодировки, отличные от стандартной локальной 8-битной кодировки. Например, приложением в локали кириллицы KOI8-R (фактический стандарт в России) может потребоваться вывод кириллицы в кодировке ISO 8859-5. Код для этого будет:

QString string = ...; // some Unicode text

QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QByteArray encodedString = codec->fromUnicode(string);

Для преобразования Юникода в локальные 8-битные кодировки доступен сокращенный вариант: функция QString::toLocal8Bit() возвращает такие 8-битные данные. Еще одним полезным сокращением является QString::toUtf8(), который возвращает текст в 8-битной кодировке UTF-8: это идеально сохраняет информацию Юникода, одновременно выглядя как обычный ASCII, если текст полностью состоит из ASCII.

Для преобразования в обратном направлении существуют удобные функции QString::fromUtf8() и QString::fromLocal8Bit(), или общий код, продемонстрированный в этом преобразовании из кириллицы ISO 8859-5 в Юникод:

QByteArray encodedString = ...; // some ISO 8859-5 encoded text

QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QString string = codec->toUnicode(encodedString);

Следует использовать Юникод для ввода-вывода, поскольку это максимизирует переносимость документов между пользователями по всему миру. Однако во многих случаях все равно необходимо поддерживать другие кодировки, поскольку вашим пользователям потребуется обрабатывать существующие документы. Самая важная дополнительная кодировка для поддержки — та, которая возвращается 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, поддерживают Юникод только ограниченно. Уровень поддержки, доступный в базовой системе, оказывает некоторое влияние на поддержку, которую Qt может предоставить на этих платформах, хотя в целом приложениям Qt не нужно слишком беспокоиться о платформенно-специфических ограничениях.

Unix/X11

  • Локализованные шрифты и методы ввода. Qt скрывает их и предоставляет ввод и вывод Юникода.
  • Конвенции файловой системы, такие как UTF-8, в настоящее время по умолчанию используются во многих вариантах Unix. Все функции файлов Qt допускают Юникод, но преобразуют имена файлов в локальную 8-битную кодировку, так как это соглашение Unix (см. QFile::setEncodingFunction(), чтобы изучить альтернативные кодировки).
  • Файловый ввод-вывод по умолчанию использует локальную 8-битную кодировку с опциями Юникода в QTextStream.
  • В некоторых старых дистрибутивах Unix есть только частичная поддержка некоторых локалей. Например, наличие каталога /usr/share/locale/ja_JP.EUC не обязательно означает, что вы сможете отобразить японский текст; вам также необходимо установить японские шрифты, и каталог /usr/share/locale/ja_JP.EUC должен быть полным. Для достижения наилучших результатов используйте полные локали от вашего поставщика систем.

Linux

  • Qt обеспечивает полную поддержку Юникода, включая методы ввода, шрифты, буфер обмена, перетаскивание.
  • Файловая система обычно закодирована в UTF-8 во всех современных дистрибутивах Linux и не должна вызывать проблем. Файловый ввод-вывод по умолчанию использует UTF-8.

Windows

  • Qt обеспечивает полную поддержку Юникода, включая методы ввода, шрифты, буфер обмена, перетаскивание и имена файлов.
  • Файловый ввод-вывод по умолчанию использует Latin1 с опциями Юникода в QTextStream. Обратите внимание, что некоторые программы Windows не понимают текстовые файлы Юникода с большим порядком байтов, даже если это порядок, предписанный стандартом Юникод в отсутствие протоколов более высокого уровня.

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-6.0/internationalization.html

Spec-Zone.ru

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