Международная локализация с Qt
Международная локализация и локализация приложения — это процессы адаптации приложения к различным языкам, региональным особенностям и техническим требованиям целевого рынка. Международная локализация означает проектирование программного приложения таким образом, чтобы его можно было адаптировать к различным языкам и регионам без внесения инженерных изменений. Локализация означает адаптацию интернационализированного программного обеспечения для определенного региона или языка путем добавления компонентов, специфичных для локализации (таких как форматы дат, времени и чисел), и перевода текста.
Соответствующие классы и API Qt
Эти классы поддерживают интернационализацию приложений Qt.
Сравнивает строки в соответствии с локализованным алгоритмом сортировки |
|
Может использоваться для ускорения сортировки строк |
|
Преобразует числа в строковые представления и наоборот на различных языках |
|
Преобразования между кодировками текста |
|
Декодер на основе состояний |
|
Кодировщик на основе состояний |
|
Поддержка интернационализации для вывода текста |
Языки и письменные системы
В некоторых случаях интернационализация проста, например, для того, чтобы приложение из США стало доступным для пользователей из Австралии или Великобритании, может потребоваться лишь несколько исправлений правописания. Но для того, чтобы приложение из США было пригодно для использования японскими пользователями, или корейское приложение — для немецких пользователей, необходимо, чтобы программное обеспечение работало не только на разных языках, но и использовало различные методы ввода, кодировки символов и соглашения о представлении.
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 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 с big-endian, даже если это порядок, предписанный стандартом Unicode в отсутствие протоколов более высокого уровня.
macOS
Для получения подробной информации о переводе, специфичном для macOS, обратитесь к документу Qt для macOS, посвящённому вопросам здесь.
Связанные страницы
Резюме правил перевода для множественного числа, созданных инструментами i18n Qt. |
|
Использование Qt Linguist для локализации вашего приложения Qt |
|
Руководство Qt Linguist: Переводы на основе идентификаторов текста |
Переводы на основе идентификаторов текста обеспечивают поддержку крупных проектов с множеством целевых локалей и большим количеством текстов для перевода |
Как написать исходный код таким образом, чтобы пользовательский видимый текст можно было перевести. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/internationalization.html